home *** CD-ROM | disk | FTP | other *** search
/ Inside Macintosh / Inside Macintosh CD-ROM_1995 (CD).toast / Books / QuickTime Components / QuickTime Components
Encoding:
Text File  |  1994-08-11  |  8.7 MB  |  26,461 lines  |  [ONLN/HLX2]

Text Truncated. Only the first 1MB is shown below. Download the file for the complete contents.
  1. INSIDE MACINTOSH
  2.  
  3. QuickTime Components
  4.     Apple Computer, Inc.
  5. © <$year>, Apple Computer, Inc.
  6. All rights reserved. 
  7. No part of this publication may be reproduced, stored in a retrieval system, or transmitted, in any form or by any means, mechanical, electronic, photocopying, recording, or otherwise, without prior written permission of Apple Computer, Inc. Printed in the United States of America.
  8. No licenses, express or implied, are granted with respect to any of the technology described in this book. Apple retains all intellectual property rights associated with the technology described in this book. This book is intended to assist application developers to develop applications only for Apple Macintosh computers.
  9. Apple Computer, Inc.
  10. 20525 Mariani Avenue
  11. Cupertino, CA 95014
  12. 408-996-1010
  13. Apple, the Apple logo, APDA, AppleLink, LaserWriter, Macintosh, MPW, and MultiFinder are trademarks of Apple Computer, Inc., registered in the United States and other countries.
  14. Balloon Help, QuickDraw, QuickTime, and System 7 are trademarks of Apple Computer, Inc.
  15. Adobe Illustrator and PostScript are trademarks of Adobe Systems Incorporated, which may be registered in certain jurisdictions.
  16. AGFA is a trademark of Agfa-Gevaert.
  17. America Online is a service mark of Quantum Computer Services, Inc.
  18. Classic is a registered trademark licensed to Apple Computer, Inc. 
  19. CompuServe is a registered service mark of CompuServe, Inc.
  20. FrameMaker is a registered trademark of Frame Technology Corporation.
  21. Helvetica and Palatino are registered trademarks of Linotype Company.
  22. Internet is a trademark of Digital Equipment Corporation.
  23. ITC Zapf Dingbats is a registered trademark of International Typeface Corporation.
  24. Windows is a registered trademark of Microsoft.
  25. Simultaneously published in the United States and Canada.
  26. LIMITED WARRANTY ON MEDIA AND REPLACEMENT
  27. ALL IMPLIED WARRANTIES ON THIS MANUAL, INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE LIMITED IN DURATION TO NINETY (90) DAYS FROM THE DATE OF THE ORIGINAL RETAIL PURCHASE OF THIS PRODUCT.
  28. Even though Apple has reviewed this manual, APPLE MAKES NO WARRANTY OR REPRESENTATION, EITHER EXPRESS OR IMPLIED, WITH RESPECT TO THIS MANUAL, ITS QUALITY, ACCURACY, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. AS A RESULT, THIS MANUAL IS SOLD “AS IS,” AND YOU, THE PURCHASER, ARE ASSUMING THE ENTIRE RISK AS TO ITS QUALITY AND ACCURACY.
  29. IN NO EVENT WILL APPLE BE LIABLE FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES RESULTING FROM ANY DEFECT OR INACCURACY IN THIS MANUAL, even if advised of the possibility of such damages.
  30. THE WARRANTY AND REMEDIES SET FORTH ABOVE ARE EXCLUSIVE AND IN LIEU OF ALL OTHERS, ORAL OR WRITTEN, EXPRESS OR IMPLIED. No Apple dealer, agent, or employee is authorized to make any modification, extension, or addition to this warranty.
  31. Some states do not allow the exclusion or limitation of implied warranties or liability for incidental or consequential damages, so the above limitation or exclusion may not apply to you. This warranty gives you specific legal rights, and you may also have other rights which vary from state to state.
  32.  
  33. ISBN 0-201-62202-5
  34. 1 2 3 4 5 6 7 8 9-MU-9796959493
  35. First Printing, May 1993
  36. Contents
  37. Figures and Listingsxiii
  38. Preface    About This Bookxvii
  39.  
  40. Format of a Typical Chapterxviii
  41. Conventions Used in This Bookxix
  42. Special Fontsxix
  43. Types of Notesxix
  44. Development Environmentxx
  45. For More Informationxx
  46. Chapter 1    Overview1-1
  47.  
  48. Providing Movie Playback1-3
  49. Capturing Sequences of Images1-6
  50. Compressing and Decompressing Still Images1-8
  51. Converting Data for Use in QuickTime Movies1-11
  52. Creating Previews of QuickTime Movies1-11
  53. Chapter 2    Movie Controller Components2-1
  54.  
  55. About Movie Controller Components2-4
  56. The Elements of a Movie Controller2-4
  57. Badges2-6
  58. Spatial Properties2-6
  59. Using Movie Controller Components2-10
  60. Playing Movies2-10
  61. Customizing Movie Controllers2-13
  62. Movie Controller Components Reference2-14
  63. Movie Controller Actions2-15
  64. Movie Controller Functions2-28
  65. Associating Movies With Controllers2-28
  66. Managing Controller Attributes2-33
  67. Handling Movie Events2-44
  68. Editing Movies2-50
  69. Getting and Setting Movie Controller Time2-56
  70. Customizing Event Processing2-58
  71. Application-Defined Function2-61
  72. Summary of Movie Controller Components2-63
  73. C Summary2-63
  74. Constants2-63
  75. Data Types2-66
  76. Movie Controller Functions2-67
  77. Application-Defined Function2-69
  78. Pascal Summary2-69
  79. Constants2-69
  80. Data Types2-73
  81. Movie Controller Routines2-73
  82. Application-Defined Routine2-75
  83. Result Codes2-75
  84. Chapter 3    Standard Image-Compression Dialog Components3-1
  85.  
  86. About Standard Image-Compression Dialog Components3-4
  87. Using Standard Image-Compression Dialog Components3-6
  88. Opening a Connection to a Standard Image-Compression Dialog Component3-8
  89. Displaying the Dialog Box to the User3-8
  90. Setting Default Parameters3-8
  91. Designating a Test Image3-9
  92. Displaying the Dialog Box and Retrieving Parameters3-10
  93. Extending the Basic Dialog Box3-11
  94. Creating a Standard Image-Compression Dialog Component3-14
  95. Standard Image-Compression Dialog Components Reference3-15
  96. Request Types3-15
  97. The Spatial Settings Request Type3-15
  98. The Temporal Settings Request Type3-17
  99. The Data-Rate Settings Request Type3-19
  100. The Color Table Settings Request Type3-20
  101. The Progress Function Request Type3-20
  102. The Extended Functions Request Type3-21
  103. The Preference Flags Request Type3-22
  104. The Settings State Request Type3-24
  105. The Sequence ID Request Type3-24
  106. The Window Position Request Type3-25
  107. The Control Flags Request Type3-25
  108. Standard Image-Compression Dialog Component Functions3-25
  109. Getting Default Settings for an Image or a Sequence3-26
  110. Displaying the Standard Image-Compression Dialog Box3-28
  111. Compressing Still Images3-29
  112. Compressing Image Sequences3-31
  113. Working With Image or Sequence Settings3-34
  114. Specifying a Test Image3-37
  115. Positioning Dialog Boxes and Rectangles3-42
  116. Utility Function3-44
  117. Application-Defined Function3-45
  118. Summary of Standard Image-Compression Dialog Components3-47
  119. C Summary3-47
  120. Constants3-47
  121. Data Types3-49
  122. Standard Image-Compression Dialog Component Functions3-50
  123. Application-Defined Function3-52
  124. Pascal Summary3-52
  125. Constants3-52
  126. Data Types3-54
  127. Standard Image-Compression Dialog Component Routines3-55
  128. Application-Defined Routine3-57
  129. Result Codes3-57
  130. Chapter 4    Image Compressor Components4-1
  131.  
  132. About Image Compressor Components4-3
  133. Banding and Extending Images4-4
  134. Spooling of Compressed Data4-6
  135. Data Loading4-6
  136. Data Unloading4-7
  137. Compressing or Decompressing Images Asynchronously4-8
  138. Progress Functions4-9
  139. Using Image Compressor Components4-10
  140. Performing Image Compression4-10
  141. Choosing a Compressor4-10
  142. Compressing a Horizontal Band of an Image4-13
  143. Decompressing an Image4-16
  144. Choosing a Decompressor4-17
  145. Decompressing a Horizontal Band of an Image4-21
  146. Image Compressor Components Reference4-26
  147. Constants4-26
  148. Image Compressor Component Capabilities4-26
  149. Format of Compressed Data and Files4-32
  150. Data Types4-35
  151. The Compressor Capability Structure4-35
  152. The Compression Parameters Structure4-40
  153. The Decompression Parameters Structure4-46
  154. Functions4-53
  155. Direct Functions4-54
  156. Indirect Functions4-62
  157. Image Compression Manager Utility Functions4-65
  158. Summary of Image Compressor Components4-69
  159. C Summary4-69
  160. Constants4-69
  161. Data Types4-72
  162. Functions4-76
  163. Image Compression Manager Utility Functions4-77
  164. Pascal Summary4-77
  165. Constants4-77
  166. Data Types4-80
  167. Routines4-83
  168. Image Compression Manager Utility Functions4-84
  169. Result Codes4-84
  170. Chapter 5    Sequence Grabber Components5-1
  171.  
  172. About Sequence Grabber Components5-3
  173. Using Sequence Grabber Components5-5
  174. Previewing and Recording Captured Data5-9
  175. Previewing5-9
  176. Recording5-10
  177. Playing Captured Data and Saving It in a QuickTime Movie5-11
  178. Initializing a Sequence Grabber Component5-11
  179. Creating a Sound Channel and a Video Channel5-12
  180. Previewing Sound and Video Sequences in a Window5-14
  181. Capturing Sound and Video Data5-18
  182. Setting Up the Video Bottleneck Functions5-19
  183. Drawing Information Over Video Frames During Capture5-20
  184. Sequence Grabber Components Reference5-22
  185. Data Types5-22
  186. The Compression Information Structure5-22
  187. The Frame Information Structure5-23
  188. Sequence Grabber Component Functions5-24
  189. Configuring Sequence Grabber Components5-24
  190. Controlling Sequence Grabber Components5-36
  191. Working With Sequence Grabber Settings5-47
  192. Working With Sequence Grabber Characteristics5-53
  193. Working With Channel Characteristics5-58
  194. Working With Channel Devices5-72
  195. Working With Video Channels5-77
  196. Working With Sound Channels5-92
  197. Video Channel Callback Functions5-99
  198. Utility Functions for Video Channel Callback Functions5-102
  199. Application-Defined Functions5-111
  200. Summary of Sequence Grabber Components5-123
  201. C Summary5-123
  202. Constants5-123
  203. Data Types5-127
  204. Sequence Grabber Component Functions5-129
  205. Application-Defined Functions5-135
  206. Pascal Summary5-136
  207. Constants5-136
  208. Data Types5-140
  209. Sequence Grabber Component Routines5-141
  210. Application-Defined Routines5-148
  211. Result Codes5-149
  212. Chapter 6    Sequence Grabber Channel Components6-1
  213.  
  214. About Sequence Grabber Channel Components6-3
  215. Creating Sequence Grabber Channel Components6-5
  216. Component Type and Subtype Values6-6
  217. Required Functions6-6
  218. Component Manager Request Codes6-7
  219. A Sample Sequence Grabber Channel Component6-10
  220. Implementing the Required Component Functions6-10
  221. Initializing the Sequence Grabber Channel Component6-15
  222. Setting and Retrieving the Channel State6-16
  223. Managing Spatial Properties6-17
  224. Controlling Previewing and Recording Operations6-20
  225. Managing Channel Devices6-24
  226. Utility Functions for Recording Image Data6-24
  227. Providing Media-Specific Functions6-28
  228. Managing the Settings Dialog Box6-29
  229. Displaying Channel Information in the Settings Dialog Box6-31
  230. Using Sequence Grabber Channel Components6-33
  231. Previewing6-33
  232. Recording6-34
  233. Working With Callback Functions6-35
  234. Using Callback Functions for Video Channel Components6-35
  235. Using Utility Functions for Video Channel Component Callback Functions 6-36
  236. Sequence Grabber Channel Components Reference6-37
  237. Functions6-37
  238. Configuring Sequence Grabber Channel Components6-38
  239. Controlling Sequence Grabber Channel Components6-39
  240. Configuration Functions for All Channel Components6-46
  241. Working With Channel Devices6-58
  242. Configuration Functions for Video Channel Components6-61
  243. Configuration Functions for Sound Channel Components6-77
  244. Utility Functions for Sequence Grabber Channel Components6-84
  245. Summary of Sequence Grabber Channel Components6-91
  246. C Summary6-91
  247. Constants6-91
  248. Data Types6-94
  249. Functions6-94
  250. Pascal Summary6-99
  251. Constants6-99
  252. Data Types6-101
  253. Routines6-102
  254. Result Codes6-107
  255. Chapter 7    Sequence Grabber Panel Components7-1
  256.  
  257. About Sequence Grabber Panel Components7-4
  258. Creating Sequence Grabber Panel Components7-7
  259. Implementing the Required Component Functions7-9
  260. Managing the Dialog Box7-11
  261. Managing Your Panel’s Settings7-13
  262. Sequence Grabber Panel Components Reference7-14
  263. Component Flags for Sequence Grabber Panel Components7-15
  264. Functions7-15
  265. Managing Your Panel Component7-15
  266. Processing Your Panel’s Events7-21
  267. Managing Your Panel’s Settings7-24
  268. Summary of Sequence Grabber Panel Components7-27
  269. C Summary7-27
  270. Constants7-27
  271. Functions7-28
  272. Pascal Summary7-29
  273. Constants7-29
  274. Routines7-29
  275. Result Codes7-30
  276. Chapter 8    Video Digitizer Components8-1
  277.  
  278. About Video Digitizer Components8-3
  279. Types of Video Digitizer Components8-5
  280. Source Coordinate Systems8-6
  281. Using Video Digitizer Components8-7
  282. Specifying Destinations8-7
  283. Starting and Stopping the Digitizer8-7
  284. Multiple Buffering8-8
  285. Obtaining an Accurate Time of Frame Capture8-8
  286. Creating Video Digitizer Components8-8
  287. Component Type and Subtype Values8-11
  288. Required Functions8-11
  289. Optional Functions8-12
  290. Frame Grabbers Without Playthrough8-12
  291. Frame Grabbers With Hardware Playthrough8-12
  292. Key Color and Alpha Channel Devices8-13
  293. Compressed Source Devices8-13
  294. Video Digitizer Components Reference8-14
  295. Constants8-14
  296. Capability Flags8-14
  297. Current Flags8-19
  298. Data Types8-20
  299. The Digitizer Information Structure8-20
  300. The Buffer List Structure8-22
  301. The Buffer Structure8-23
  302. Video Digitizer Component Functions8-23
  303. Getting Information About Video Digitizer Components8-24
  304. Setting Source Characteristics8-26
  305. Selecting an Input Source8-30
  306. Setting Video Destinations8-34
  307. Controlling Compressed Source Devices8-42
  308. Controlling Digitization8-52
  309. Controlling Color8-60
  310. Controlling Analog Video8-65
  311. Selectively Displaying Video8-81
  312. Clipping8-89
  313. Utility Functions8-92
  314. Application-Defined Function8-98
  315. Summary of Video Digitizer Components8-99
  316. C Summary8-99
  317. Constants8-99
  318. Data Types8-104
  319. Video Digitizer Component Functions8-105
  320. Application-Defined Function8-111
  321. Pascal Summary8-111
  322. Constants8-111
  323. Data Types8-116
  324. Video Digitizer Component Routines8-117
  325. Application-Defined Routine8-123
  326. Result Codes8-124
  327. Chapter 9    Movie Data Exchange Components9-1
  328.  
  329. About Movie Data Exchange Components9-3
  330. Using Movie Data Exchange Components9-5
  331. Importing and Exporting Movie Data9-6
  332. Configuring a Movie Data Exchange Component9-6
  333. Finding a Specific Movie Data Exchange Component9-6
  334. Creating a Movie Data Exchange Component9-8
  335. A Sample Movie Import Component9-9
  336. Implementing the Required Import Component Functions9-10
  337. Importing a Scrapbook File9-12
  338. A Sample Movie Export Component9-15
  339. Implementing the Required Export Component Functions9-16
  340. Exporting Data to a PICS File9-18
  341. Movie Data Exchange Components Reference9-20
  342. Importing Movie Data9-20
  343. Configuring Movie Data Import Components9-26
  344. Exporting Movie Data9-34
  345. Configuring Movie Data Export Components9-37
  346. Summary of Movie Data Exchange Components9-41
  347. C Summary9-41
  348. Constants9-41
  349. Data Type9-42
  350. Functions9-42
  351. Pascal Summary9-44
  352. Constants9-44
  353. Data Type9-45
  354. Routines9-45
  355. Result Codes9-47
  356. Chapter 10    Derived Media Handler Components10-1
  357.  
  358. About Derived Media Handler Components10-4
  359. Media Handler Components10-4
  360. Derived Media Handler Components10-6
  361. Creating a Derived Media Handler Component10-7
  362. Component Flags for Derived Media Handlers10-8
  363. Request Processing10-8
  364. A Sample Derived Media Handler Component10-9
  365. Implementing the Required Component Functions10-9
  366. Initializing a Derived Media Handler Component10-12
  367. Drawing the Media Sample10-13
  368. Derived Media Handler Components Reference10-15
  369. Data Type10-15
  370. Functions10-18
  371. Managing Your Media Handler Component10-18
  372. General Data Management10-23
  373. Graphics Data Management10-31
  374. Sound Data Management10-37
  375. Base Media Handler Utility Function10-38
  376. Summary of Derived Media Handler Components10-41
  377. C Summary10-41
  378. Constants10-41
  379. Data Type10-43
  380. Functions10-43
  381. Pascal Summary10-45
  382. Constants10-45
  383. Data Type10-46
  384. Routines10-47
  385. Chapter 11    Clock Components11-1
  386.  
  387. About Clock Components11-3
  388. Clock Components Reference11-5
  389. Component Capability Flags for Clocks11-5
  390. Component Types for Clocks11-6
  391. Data Type11-6
  392. Clock Component Functions11-7
  393. Getting the Current Time11-9
  394. Using the Callback Functions11-9
  395. Managing the Time11-15
  396. Movie Toolbox Clock Support Functions11-18
  397. Summary of Clock Components11-22
  398. C Summary11-22
  399. Constants11-22
  400. Data Type11-24
  401. Clock Component Functions11-24
  402. Movie Toolbox Clock Support Functions11-25
  403. Pascal Summary11-25
  404. Constants11-25
  405. Data Type11-27
  406. Clock Component Routines11-27
  407. Movie Toolbox Clock Support Routines11-28
  408. Chapter 12    Preview Components12-1
  409.  
  410. About Preview Components12-3
  411. Obtaining Preview Data12-3
  412. Storing Preview Data in Files12-5
  413. Using the Preview Data12-5
  414. Creating Preview Components12-6
  415. Implementing Required Component Functions12-7
  416. Displaying Image Data as a Preview12-8
  417. Preview Components Reference12-10
  418. Functions12-10
  419. Displaying Previews12-10
  420. Handling Events12-11
  421. Creating Previews12-11
  422. Resources12-13
  423. The Preview Resource12-14
  424. The Preview Resource Item Structure12-15
  425. Summary of Preview Components12-16
  426. C Summary12-16
  427. Constants12-16
  428. Data Types12-16
  429. Functions12-17
  430. Pascal Summary12-17
  431. Constants12-17
  432. Data Types12-18
  433. Routines12-19
  434. GlossaryGL-1
  435.  
  436. IndexIN-1
  437. Figures and Listings
  438. Chapter 1    Overview1-1
  439.  
  440. Figure 1-1    QuickTime components for movie playback1-5
  441. Figure 1-2    QuickTime components for image capture1-7
  442. Figure 1-3    QuickTime components for compressing still images1-9
  443. Figure 1-4    QuickTime components for decompressing still images1-10
  444. Chapter 2    Movie Controller Components2-1
  445.  
  446. Figure 2-1    The standard movie controller2-5
  447. Figure 2-2    A movie with a badge2-6
  448. Figure 2-3    Movie controller spatial elements for attached controllers2-7
  449. Figure 2-4    Movie controller spatial elements for detached controllers2-8
  450. Figure 2-5    Clipping the controller window region with the controller clipping region2-9
  451. Listing 2-1    Playing a movie with a movie controller component2-10
  452. Listing 2-2    Using a movie controller filter function2-13
  453. Chapter 3    Standard Image-Compression Dialog Components3-1
  454.  
  455. Figure 3-1    Dialog box for single-frame compression3-4
  456. Figure 3-2    Dialog box for image-sequence compression3-5
  457. Figure 3-3    Elements of the standard image-compression dialog box3-7
  458. Listing 3-1    Specifying a test image3-9
  459. Listing 3-2    Displaying the dialog box to the user and compressing an image3-11
  460. Listing 3-3    Defining a custom button in the dialog box3-12
  461. Listing 3-4    A sample hook function3-12
  462. Listing 3-5    Positioning related dialog boxes3-13
  463. Chapter 4    Image Compressor Components4-1
  464.  
  465. Figure 4-1    Image bands and their measurements4-7
  466. Listing 4-1    Preparing for simple compression operations4-12
  467. Listing 4-2    Performing simple compression on a horizontal band of an image4-13
  468. Listing 4-3    Preparing for simple decompression4-20
  469. Listing 4-4    Performing a decompression operation4-21
  470. Chapter 5    Sequence Grabber Components5-1
  471.  
  472. Figure 5-1    Relationships among your application, a sequence grabber component, and channel components5-4
  473. Figure 5-2    The effect of the SGSetCompressBuffer function5-88
  474. Listing 5-1    Initializing a sequence grabber component5-11
  475. Listing 5-2    Creating a sound channel and a video channel5-12
  476. Listing 5-3    Previewing sound and video sequences in a window5-14
  477. Listing 5-4    Capturing sound and video5-18
  478. Listing 5-5    Setting up the video bottleneck functions5-19
  479. Listing 5-6    Drawing information over video frames during capture5-20
  480. Chapter 6    Sequence Grabber Channel Components6-1
  481.  
  482. Figure 6-1    Relationships of an application, a sequence grabber component, and channel components6-4
  483. Listing 6-1    Setting up global variables and implementing required functions6-10
  484. Listing 6-2    Initializing the sequence grabber channel component6-15
  485. Listing 6-3    Determining usage parameters and getting usage data6-16
  486. Listing 6-4    Managing spatial characteristics6-17
  487. Listing 6-5    Controlling previewing and recording operations6-20
  488. Listing 6-6    Coordinating devices for the channel component6-24
  489. Listing 6-7    Recording image data6-25
  490. Listing 6-8    Showing the tick count6-28
  491. Listing 6-9    Including a tick count checkbox in a dialog box in the panel component6-29
  492. Listing 6-10    Displaying channel settings6-31
  493. Chapter 7    Sequence Grabber Panel Components7-1
  494.  
  495. Figure 7-1    Sequence grabbers, channel components, and panel components7-5
  496. Figure 7-2    A sample sequence grabber settings dialog box7-6
  497. Listing 7-1    Implementing the required functions7-9
  498. Listing 7-2    Managing the settings dialog box7-12
  499. Listing 7-3    Managing the settings for a panel component7-13
  500. Chapter 8    Video Digitizer Components8-1
  501.  
  502. Figure 8-1    Basic tasks of a video digitizer8-4
  503. Figure 8-2    Video digitizer rectangles8-6
  504. Chapter 9    Movie Data Exchange Components9-1
  505.  
  506. Figure 9-1    The Movie Toolbox, movie data import components, and your application9-4
  507. Figure 9-2    The Movie Toolbox, movie data export components, and your application9-5
  508. Listing 9-1    Implementing the required import functions9-10
  509. Listing 9-2    Importing a Scrapbook file9-12
  510. Listing 9-3    Implementing the required export functions9-16
  511. Listing 9-4    Exporting a frame of movie data to a PICS file9-18
  512. Chapter 10    Derived Media Handler Components10-1
  513.  
  514. Figure 10-1    Logical relationships between the Movie Toolbox and media handlers10-5
  515. Figure 10-2    Relationship between the base media handler component and derived media handlers10-6
  516. Listing 10-1    Implementing the required functions10-9
  517. Listing 10-2    Initializing a derived media handler10-13
  518. Listing 10-3    Drawing the media sample10-13
  519. Chapter 11    Clock Components11-1
  520.  
  521. Figure 11-1    Relationships of an application, the movie controller component, the Movie Toolbox, and a clock component11-4
  522. Chapter 12    Preview Components12-1
  523.  
  524. Figure 12-1    Relationships of a preview component, the Image Compression Manager, and an application12-5
  525. Listing 12-1    Implementing the required Component Manager functions12-7
  526. Listing 12-2    Converting data into a form that can be displayed as a preview12-9
  527. Listing 12-3    The preview resource12-14
  528. Listing 12-4    The preview resource item structure12-15
  529. About This Book
  530.  
  531.  
  532. This book describes the components supplied by Apple Computer, Inc., 
  533. with QuickTime. A component is a code resource that is registered by the Component Manager. To understand components fully, you should be familiar with the material in the chapter “Component Manager” in Inside Macintosh: More Macintosh Toolbox, which describes how to build a component.
  534. This book provides a complete technical reference to movie controller components, standard image-compression dialog components, image compressor components, sequence grabber components, sequence 
  535. grabber channel components, sequence grabber panel components, video digitizer components, movie data exchange components, derived media handler components, clock components, and preview components.
  536. You should read this book if you are developing an application that uses QuickTime components, or if you are developing a component that will be managed by the Component Manager. Whether you are developing a component or an application that uses components, you need to know how to call component functions. See the chapter “Component Manager” in Inside Macintosh: More Macintosh Toolbox for information on using components. If you are developing a component, you should also read the material in that chapter that describes how to build a component.
  537. Each of these chapters discusses the features provided by a component type as well as the interface supported by components of that type. The interfaces are formatted for use by application developers. If you are developing a component, you must design and implement your component in a way that satisfies this interface.
  538. If you are developing an application that can play movies, you should consider using movie controller components to manage your movie user interface. To learn about the capabilities of movie controllers, read the chapter “Movie Controller Components.” If you are developing a movie controller component, the chapter also describes the interfaces that your component must support. 
  539. If you want to use a standard image-compression dialog component in your application, you should read the chapter “Standard Image-Compression Dialog Components.” If you want to create your own standard 
  540. image-compression dialog component, you should be familiar with all of the information in that chapter.
  541. If you are developing an image compressor component, you should read all the material in the chapter “Image Compressor Components.”
  542. If you are writing an application that needs to acquire data from sources external to the Macintosh computer, or if you are developing a sequence grabber channel component, you should read the chapter “Sequence Grabber Components.”
  543. If you are developing a sequence grabber channel component, you should also read the chapter “Sequence Grabber Channel Components.”
  544. If you plan to create a sequence grabber panel component, you should read the chapter “Sequence Grabber Panel Components.”
  545. If you want to develop or use a video digitizer component, you should read the chapter “Video Digitizer Components.”
  546. If you plan to create either movie data import or movie data export components, or if you are writing an application that uses components of this type, you should read the chapter “Movie Data Exchange Components.”
  547. If you plan to develop a derived media handler component, you should read the chapter “Derived Media Handler Components.”
  548. If you want to develop your own clock component for use by the Movie Toolbox, you should read the chapter “Clock Components,” which describes what you must do to create a clock component.
  549. If you want to develop your own preview component, you should read the chapter “Preview Components,” which tells what to do to create a preview component.
  550. If you are going to play movies or compress images, you should 
  551. be familiar with QuickDraw and Color QuickDraw, described in Inside Macintosh: Imaging. If you are going to create QuickTime movies, 
  552. you should be familiar with the Sound Manager, described in 
  553. Inside Macintosh: More Macintosh Toolbox, and with the human interface guidelines, described in Macintosh Human Interface Guidelines.
  554. The companion to this book, Inside Macintosh: QuickTime, describes QuickTime, an extension of the Macintosh system software that enables you to integrate time-based data into mainstream Macintosh applications. That book also provides a complete technical reference to the Movie Toolbox, the Image Compression Manager, and the movie resource formats.
  555.  
  556. Format of a Typical Chapter
  557.  
  558. Almost all chapters in this book follow a standard structure. For example, the chapter “Movie Controller Components” contains these sections:
  559. n    “About Movie Controller Components.” This section provides an overview of the features provided by movie controller components.
  560. n    “Using Movie Controller Components.” This section describes the tasks you can accomplish using movie controller components. It describes how to use the most common functions, gives related user interface information, provides code samples, and supplies additional information.
  561. n    “Movie Controller Components Reference.” This section provides a complete reference to movie controller components by describing the constants, data structures, and functions that they use. Each function description also follows a standard format, which gives the function declaration and description of every parameter of the function. Some function descriptions also give additional descriptive information, such as result codes.
  562. n    “Summary of Movie Controller Components.” This section provides the 
  563.  C interface, as well as the Pascal interface, for the constants, data structures, functions, and result codes associated with movie controller components.
  564.  
  565. Conventions Used in This Book
  566.  
  567. Inside Macintosh uses various conventions to present information. Words that require special treatment appear in specific fonts or font styles. Certain information, such as parameter blocks, uses special formats so that you can scan it quickly.
  568. Special Fonts
  569.  
  570. All code listings, reserved words, and the names of actual data structures, constants, fields, parameters, and functions are shown in Courier (this is Courier).
  571. Words that appear in boldface are key terms or concepts and are defined in the glossary.
  572. Types of Notes
  573.  
  574. There are several types of notes used in this book. 
  575. Note
  576. A note like this contains information that is interesting but possibly not essential to an understanding of the main text. (An example appears on page 2-24.)u
  577. IMPORTANT
  578. A note like this contains information that is essential for an understanding of the main text. (An example appears on page 5-87.)s
  579. sWARNING
  580. Warnings like this indicate potential problems that you should be aware of as you design your application. Failure to heed these warnings could result in system crashes or loss of data. (An example appears on page 5-39.)s
  581.  
  582.  
  583. Development Environment
  584.  
  585. The system software functions described in this book are available using C, Pascal, or assembly-language interfaces. How you access these functions depends on the development environment you are using. This book shows system software functions in their C interface using the Macintosh Programmer’s Workshop (MPW) version 3.2. 
  586. All code listings in this book are shown in C. They show methods of using various functions and illustrate techniques for accomplishing particular tasks. All code listings have been compiled and, in most cases, tested. However, Apple does not intend that you use these code samples in your application.
  587.  
  588. For More Information
  589.  
  590. APDA is Apple’s worldwide source for over three hundred development tools, technical resources, training products, and information for anyone interested in developing applications on Apple platforms. Customers receive the quarterly APDA Tools Catalog featuring all current versions of Apple development tools and the most popular third-party development tools. Ordering is easy; there are no membership fees, and application forms are not required for most of our products. APDA offers convenient payment and shipping options, including site licensing.
  591. To order products or to request a complimentary copy of the APDA Tools Catalog, contact
  592. APDA
  593. Apple Computer, Inc.
  594. P.O. Box 319
  595. Buffalo, NY 14207-0319Telephone    800-282-2732 (United States)    
  596.     800-637-0029 (Canada)    
  597.     716-871-6555 (International)    
  598. Fax    716-871-6511    
  599. AppleLink    APDA    
  600. America Online    APDA    
  601. CompuServe    76666,2405    
  602. Internet    APDA@applelink.apple.com    
  603.  
  604. If you provide commercial products and services, call 408-974-4897 for information on the developer support programs available from Apple.
  605. For information on registering signatures, file types, Apple events, and other technical information, contactMacintosh Developer Technical Support    
  606. Apple Computer, Inc.    
  607. 20525 Mariani Avenue, M/S 75-3T    
  608. Cupertino, CA 95014-6299    
  609.  
  610. Listing 1-0
  611. Table 1-0
  612. Overview
  613. Contents
  614. Providing Movie Playback1-3
  615. Capturing Sequences of Images1-6
  616. Compressing and Decompressing Still Images1-8
  617. Converting Data for Use in QuickTime Movies1-11
  618. Creating Previews of QuickTime Movies1-11
  619. Overview
  620. Each QuickTime component provides an interface to a general class of features associated with the manipulation of time-based data. QuickTime provides components so that developers may use a component—for example, one that provides image compression services—without extensive knowledge of all the possible services that that component might provide. Developers are therefore isolated from the details of implementing and managing a given technology.
  621. Since each QuickTime component is registered by the Component Manager, the component’s code can be available systemwide or in a resource that is local to a particular application. 
  622. QuickTime components supply these services:
  623. n    movie playback (including the provision of basic time information and the interpretation of the data to be played)
  624. n    image capture 
  625. n    compression and decompression of still images 
  626. n    exchange of movie data
  627. n    creation and display of movie previews
  628. This book addresses two audiences—developers who communicate directly with existing components and developers who want to create their own components.
  629.  
  630. Providing Movie Playback
  631.  
  632. Figure 1-1 shows the QuickTime components that allow your application to provide movie playback. 
  633. n    Your application calls the movie controller component in order to play movies. Movie controller components implement movie controllers, which present a user interface for playing and editing movies. For details on the features of movie controller components and the interfaces they must support, see the chapter “Movie 
  634. Controller Components” in this book.
  635. n    The movie controller component communicates with the Movie Toolbox’s functions in order to obtain and receive time-based information from the clock component. Clock components supply basic time information to their clients. For details, see the chapter “Clock Components” in this book.
  636. n    The Movie Toolbox passes control to media handler components, which actually interpret the data that will be played. Media handlers allow the Movie Toolbox to access the data in a media. They isolate the Movie Toolbox from the details of how or where a particular media is stored. This makes QuickTime extensible to new data formats and storage devices. If you want to develop a media handler component, read the chapter “Derived Media Handler Components” in this book.
  637. n    The media handler component passes control to the Image Compression Manager’s decompression functions, which send the movie data to a decompressor component. A decompressor component is one kind of image compressor component, a code resource that may provide either compression or decompression services. For details on decompressor components, see the chapter “Image Compressor Components” in this book.
  638. n    The decompressor component actually decompresses the movie data so that it can be played on the screen of the Macintosh computer.
  639. Figure 1-1    QuickTime components for movie playback
  640.  
  641.  
  642.  
  643. Capturing Sequences of Images
  644.  
  645. Figure 1-2 shows the QuickTime components that allow your application to capture image data for storage or for further processing by video equipment.
  646. n    Your application calls the sequence grabber component to digitize data. Sequence grabber components allow applications to obtain digitized data from sources that are external to a Macintosh computer. For more information on how to use these components to acquire images, read the chapter “Sequence Grabber Components” in this book.
  647. n    The sequence grabber component uses both sequence grabber panel components and sequence grabber channel components.
  648. n    The sequence grabber panel component obtains configuration information before it calls the sequence grabber channel component to manipulate the captured data. For details on creating sequence grabber panel components, see the chapter “Sequence Grabber Panel Components” in this book.
  649. n    The sequence grabber channel component manipulates the captured data. For details on sequence grabber channel components, see the chapter “Sequence Grabber Channel Components” in this book.
  650. n    Image compressor components are used by the sequence grabber channel component, if necessary.
  651. n    The sequence grabber channel component calls either a video digitizer component or the Image Compression Manager.
  652. n    The video digitizer component obtains the digitized data from an analog video source. To understand how to use or create a video digitizer component, see the chapter “Video Digitizer Components” in this book.
  653. n    The Image Compression Manager’s compression functions store the image in a storage media—for example, in a data pack.
  654. Figure 1-2    QuickTime components for image capture
  655.  
  656.  
  657.  
  658. Compressing and Decompressing Still Images
  659.  
  660. QuickTime components allow your application to compress and decompress still images. 
  661. Figure 1-3 provides an overview of QuickTime components for the compression and decompression of still images.
  662. n    Your application calls the standard image-compression dialog component to select parameters for governing the compression of an image and for managing the compression operation.
  663. n    The standard image-compression dialog component calls the Image Compression Manager.
  664. n    The Image Compression Manager may commence the compression operation in one of two ways:
  665. n    It may send the image directly to an image compressor component and then to a storage media, such as a data pack.
  666. n    It may send the image to the Apple-supplied decompressor, the 'raw ' decompressor, and then through a band buffer (for conversion to the image depth required by the compressor component) before sending it to the image compressor component.
  667. n    The compressor component compresses the image and sends it to the storage media.
  668. Figure 1-3    QuickTime components for compressing still images
  669.  
  670. Figure 1-4 shows the relationships of the components that allow your application to take an image from a storage media and decompress it so that it may be displayed on the Macintosh screen.
  671. n    Your application calls the QuickDraw DrawPicture routine, which the Image Compression Manager intercepts. The Image Compressor decompresses the image. Alternatively, your application may communicate directly with the Image Compression Manager, which sends the compressed image to the decompressor component. 
  672. n    The decompressor component sends the image directly to the Macintosh screen or to a band buffer that meets the requirements of the decompressor (in features such as pixel depth and dimension). The contents of the band buffer are then copied to the screen by the 'raw ' decompressor, which performs any necessary conversion.
  673. Figure 1-4    QuickTime components for decompressing still images
  674.  
  675.  
  676.  
  677. Converting Data for Use in QuickTime Movies
  678.  
  679. Movie data exchange components allow your application to convert data in various formats so that it can be imported to or exported from a QuickTime movie. For information on using or creating these components, see the chapter “Movie Data Exchange Components” in this book.
  680.  
  681. Creating Previews of QuickTime Movies
  682.  
  683. Preview components let your application create and display previews of QuickTime movies. The Image Compression Manager is the primary client of movie preview components. For details on developing preview components, see the chapter 
  684. “Preview Components” in this book.
  685. Listing 2-0
  686. Table 2-0
  687. Movie Controller Components
  688. Contents
  689. About Movie Controller Components2-4
  690. The Elements of a Movie Controller2-4
  691. Badges2-6
  692. Spatial Properties2-6
  693. Using Movie Controller Components2-10
  694. Playing Movies2-10
  695. Customizing Movie Controllers2-13
  696. Movie Controller Components Reference2-14
  697. Movie Controller Actions2-15
  698. Movie Controller Functions2-28
  699. Associating Movies With Controllers2-28
  700. Managing Controller Attributes2-33
  701. Handling Movie Events2-44
  702. Editing Movies2-50
  703. Getting and Setting Movie Controller Time2-56
  704. Customizing Event Processing2-58
  705. Application-Defined Function2-61
  706. Summary of Movie Controller Components2-63
  707. C Summary2-63
  708. Constants2-63
  709. Data Types2-66
  710. Movie Controller Functions2-67
  711. Application-Defined Function2-69
  712. Pascal Summary2-69
  713. Constants2-69
  714. Data Types2-73
  715. Movie Controller Routines2-73
  716. Application-Defined Routine2-75
  717. Result Codes2-75
  718. Movie Controller Components
  719. This chapter describes movie controller components. Movie controller components provide a high-level interface that allows your application to present movies to users quickly and easily. Movie controllers, the controls managed by movie controller components, present a user interface for playing and editing movies. Movie 
  720. controller components eliminate much of the complexity of working with movies by assuming primary responsibility for the movie, freeing your application to focus on the unique services it offers to users.
  721. This chapter has been divided into the following sections:
  722. n    “About Movie Controller Components” describes the capabilities of movie controller components in general and discusses the movie controller component supplied 
  723. by Apple.
  724. n    “Spatial Properties” discusses the display regions that are supported by movie controller components—your application can manipulate these regions to control how the controller is displayed.
  725. n    “Using Movie Controller Components” provides sample code that shows you how to play, edit, and customize movies with movie controller components.
  726. n    “Movie Controller Components Reference” describes the functions provided to your application by movie controller components.
  727. n    “Summary of Movie Controller Components” provides a condensed listing of the constants, data structures, and functions supported by these components.
  728. If you are developing an application that can play movies, you should consider using movie controller components to manage your movie user interface. They provide a consistent user interface that shields you from the details of using the Movie Toolbox. To learn about the capabilities of movie controllers, read “About Movie Controller Components.” If your application allows the user to play movies, read “Spatial Properties.” If you anticipate doing event management, read “Customizing Movie Controllers” beginning on page 2-13 and “Application-Defined Function” beginning on page 2-61 as well. All movie controller functions are described in “Movie Controller Components Reference”—you should read the portions that are relevant to 
  729. your application.
  730. If you are developing a movie controller component, the information in this chapter describes the interface that your component must support. In addition, you should be familiar with the material in the chapter “Component Manager” in Inside Macintosh: More Macintosh Toolbox, which describes how to build a component.
  731.  
  732.  
  733. About Movie Controller Components
  734.  
  735. Movie controller components provide movie playback and editing capabilities to applications. In so doing, movie controller components remove from your application much of the burden of presenting an interface for movie playback and editing. It is possible to have the controller do nearly all the work involved with playing movies, including updating and idling. Alternatively, your application can take care of some or all of these tasks.
  736. You can think of movie controller components in terms of more familiar Macintosh controls. Movie controller components, in addition to handling update, activate, and mouse-down events, also know how to interact with the data that they control. Consequently, the movie controller components can actually perform the commands requested by users (the controls handled by the Control Manager merely report user actions to your application). In this way, your application is relieved of much of the work of controlling movies. Furthermore, movie controller components can be updated to provide improved functionality with no impact on your application.
  737. Movie controller components have a component type value of 'play'. You can use the following constant to specify this value.
  738. #define MovieControllerComponentType 'play'
  739. Apple has defined the functional interface that is supported by movie controller components so that you can create a wide variety of movie controls. For example, you could create a control that is separate from the movie image. Consequently, the interface is a bit more complex than might seem necessary for simple controls that support only playback. For details on the functions that your component must support, see “Movie Controller Components Reference,” which begins on page 2-14.
  740. The Elements of a Movie Controller
  741.  
  742. The movie controller component provided with QuickTime by Apple provides control elements for regulating sound, starting, stopping, pausing, single-stepping (forward and backward), and moving to a specified time. Figure 2-1 shows the controls supported by Apple’s movie controller component. If the user resizes the controller so that there is not enough space to display all the individual control elements, the movie controller component eliminates elements from the display. Note that this controller allows the user to start and stop the movie by clicking the movie image itself. This is an important feature, because it allows the user to control the movie even in circumstances where no control elements are visible.
  743. Figure 2-1    The standard movie controller
  744.  
  745. The movie controller presented by Apple’s movie controller component contains a number of individual controls, as shown in Figure 2-1. These controls include:
  746. n    A volume control. This control allows the user to adjust the sound volume—holding down the mouse button while the cursor is on this control causes the controller to display a slider that allows the user to change the sound volume while the movie is playing (if a movie does not have any sound, the movie controller component disables the volume control).
  747. n    A play button. This control allows the user to start and stop the movie. Clicking the play button causes the movie to start playing; in addition, the movie controller component changes the play button into a pause button. Clicking the pause button causes the movie to stop playing. If the user starts the movie and does not stop it, the movie controller plays the movie once and then stops the movie.
  748. n    A slider. This control allows the user to quickly navigate through a movie’s contents. Dragging the indicator within the slider displays a single frame of the movie that corresponds to the position of the indicator. Clicking within the slider causes the indicator to jump to the location of the mouse click and causes the movie controller component to display the corresponding movie data. 
  749. n    Step buttons. These controls allow the user to move through the movie frame by frame, either forward or backward. Holding the mouse button down while the cursor is on a step button causes the movie controller to step through the movie, frame by frame, in the appropriate direction. 
  750. Badges
  751.  
  752. The movie controller component supplied by Apple allows your application to distinguish movies from static graphics in documents by the use of a badge. A badge is a visual element that the movie controller can display as part of a movie when the 
  753. other controls are not visible and the movie is not playing. Figure 2-2 shows a movie with a badge.
  754. Figure 2-2    A movie with a badge
  755.  
  756. The badge lets the user know that the image represents a movie rather than a static image. A badge appears under the following conditions: 
  757. n    the movie is in badge mode—that is, the mcActionSetUseBadge movie controller action was called with a value of true
  758. n    the movie is not playing
  759. n    the movie controller is hidden
  760. When the user double-clicks the movie, the movie starts playing and the badge disappears; a single click stops the movie, and the badge reappears. When the user clicks the badge itself, the movie controller component displays the controls, as shown in Figure 2-1.
  761. Your application can control whether the movie controller component displays a badge with a movie. Use the NewMovieController function (described on page 2-29) to create a new controller.
  762.  
  763. Spatial Properties
  764.  
  765. Movie controller components define several display regions that govern how a controller and its movie are displayed. In addition, movie controller components support a number of functions that allow your application to manipulate these regions and thereby control the display of a controller and its associated movie. This section discusses each of these regions and the movie controller component functions that your application can use to work with these regions.
  766. The displayed representation of a movie controller consists of two parts: the movie 
  767. and the controller itself. The movie consists of the QuickTime movie image. The controller consists of the visual elements that allow the user to control the movie. 
  768. Figure 2-1 on page 2-5 shows a sample controller. In this figure, note that the movie is attached to the controller—that is, the movie and the controller are contiguous. Movie controller components also allow you to create controllers that are separate from, or detached from, their associated movies. You use the MCSetControllerAttached function (described on page 2-35) to control this attribute. This gives you the freedom to position the movie and the controller.
  769. Movie controller components define several spatial elements that allow your application to control the display of a movie and its controller. Figure 2-3 shows the relationships between these spatial elements for attached controllers, whereas Figure 2-4 shows the relationships between these spatial elements for detached controllers. 
  770. Figure 2-3    Movie controller spatial elements for attached controllers
  771.  
  772. The controller boundary rectangle is a rectangle that completely encloses the controller. If the controller is attached to its movie, the controller boundary rectangle also encloses the movie. The width of this rectangle corresponds to the widest part of the displayed representation of the controller (and its attached movie). Similarly, its height is derived from the highest part of the controller (and its attached movie). You can use the MCSetControllerBoundsRect function to modify the controller boundary rectangle to define display transformations to be applied to a controller and its movie. 
  773. You can retrieve a controller’s boundary rectangle by calling the MCGetControllerBoundsRect function (described on page 2-39).
  774. The controller boundary region defines the region occupied by the controller. 
  775. If the movie is attached to the controller, the controller boundary region also includes the movie. The controller boundary region corresponds exactly to the display footprint of the controller (and its attached movie). You can retrieve the boundary region of a controller by calling the MCGetControllerBoundsRgn function (described on page 2-40).
  776. Figure 2-4    Movie controller spatial elements for detached controllers
  777.  
  778. The controller boundary rectangle and controller boundary region both work with the unclipped display representation of the controller and its movie. The controller window region represents the portion of the controller and its movie that is actually displayed on the computer screen, after clipping by the controller clipping region. The controller window region always includes both the controller and its movie, whether the controller is attached or detached. You can retrieve a controller’s window region by calling the MCGetWindowRgn function (described on page 2-41). You can manipulate a controller’s clipping region by calling the MCSetClip and MCGetClip functions (described on page 2-42 and page 2-43, respectively). Figure 2-5 shows how the controller clipping region affects the controller window region.
  779. Figure 2-5    Clipping the controller window region with the controller clipping region
  780.  
  781.  
  782.  
  783. Using Movie Controller Components
  784.  
  785. This section supplies examples of how to use the standard movie controller to play movies. It also provides sample code for customizing movie controller components.
  786. Playing Movies
  787.  
  788. The following sample code demonstrates how to use the standard movie controller component to play a movie. The GetMovie function prompts the user to select a movie file and then get a movie out of it. It then opens the movie and allows the user to play it.
  789. Listing 2-1    Playing a movie with a movie controller component
  790.  
  791. MovieController                        gController;
  792. WindowPtr                         gWindow;
  793. Rect                         windowRect;
  794. Movie                         gMovie;
  795. Boolean                         gDone;
  796. OSErr                         gErr;
  797. ComponentResult                         gCErr;
  798. Boolean                         gResult;
  799. EventRecord                         gTheEvent;
  800. WindowPtr                         whichWindow;
  801. short                         part;
  802. pascal Movie                    GetMovie(void);
  803. pascal Movie                    GetMovie(void)
  804. {
  805.     OSErr                        err;
  806.     SFTypeList                         typeList;
  807.     StandardFileReply     reply;
  808.     Movie                         aMovie;
  809.     short                         movieResFile;
  810.     short                         movieResID;
  811.     Str255                         movieName;
  812.     Boolean                         wasChanged;
  813.     aMovie = nil;
  814.     typeList[0] = MovieFileType;
  815.     StandardGetFilePreview ( (FileFilterProcPtr)nil, 1, 
  816.                                     typeList, &reply);
  817.     if (reply.sfGood) {
  818.         err = OpenMovieFile (&reply.sfFile, &movieResFile,
  819.                                      fsRdPerm);
  820.         if (err == noErr) {
  821.             movieResID = 0;
  822.             err = NewMovieFromFile (&aMovie, movieResFile,
  823.                                              &movieResID,
  824.                                              movieName, 
  825.                                              newMovieActive,
  826.                                              &wasChanged);
  827.             err = CloseMovieFile (movieResFile);
  828.         }
  829.     }
  830.     return aMovie;
  831. }
  832. void main(void);
  833. void main(void)
  834. {
  835.     InitGraf(&qd.thePort);
  836.     InitFonts();
  837.     InitWindows();
  838.     InitMenus();
  839.     TEInit();
  840.     InitDialogs(nil);
  841.     gErr = EnterMovies();
  842.     SetRect (&windowRect, 100, 100, 200, 200);
  843.     gWindow = NewCWindow (nil, 
  844.                     &windowRect, 
  845.                     "\pMovie", 
  846.                     false, 
  847.                     noGrowDocProc, 
  848.                     (WindowPtr)-1, 
  849.                     true, 
  850.                     0);
  851.     SetPort (gWindow);
  852.     gMovie = GetMovie();
  853.     if (gMovie != nil) {
  854.         SetRect(&windowRect, 0, 0, 100, 100);
  855.         gController = NewMovieController (gMovie, &windowRect,
  856.                                                      mcTopLeftMovie);
  857.         if (gController != nil) {
  858.             gCErr = MCGetControllerBoundsRect (gController,
  859.                                                                  &windowRect);
  860.             SizeWindow (gWindow, windowRect.right, windowRect.bottom,
  861.                              true);
  862.             ShowWindow (gWindow);
  863.             gCErr = MCDoAction (gController, mcActionSetKeysEnabled,
  864.                                         (Ptr)true);
  865.             gDone = false;
  866.             while (! gDone) {
  867.                 gResult = GetNextEvent (everyEvent, &gTheEvent);
  868.                 if (MCIsPlayerEvent (gController, &gTheEvent) == 0) {
  869.                     switch (gTheEvent.what) {
  870.                         case updateEvt:    
  871.                             whichWindow = (WindowPtr)gTheEvent.message;
  872.                             BeginUpdate (whichWindow);
  873.                             EraseRect (&(*whichWindow).portRect);
  874.                             EndUpdate (whichWindow);
  875.                             break;                            
  876.                         case mouseDown:    
  877.                             part = FindWindow (gTheEvent.where,
  878.                                                      &whichWindow);
  879.                             if (whichWindow == gWindow) {
  880.                                 switch (part) {
  881.                                     case inGoAway:    
  882.                                         gDone = TrackGoAway (whichWindow, 
  883.                                                         gTheEvent.where);
  884.                                         break;                                        
  885.                                     case inDrag:    
  886.                                         DragWindow (whichWindow,
  887.                                                     gTheEvent.where,
  888.                                                     &(qd.screenBits.bounds) );
  889.                                         break;
  890.                                 }
  891.                             }
  892.                     }
  893.                 }
  894.             }
  895.             DisposeMovieController(gController);
  896.         }
  897.         DisposeMovie(gMovie);
  898.     }
  899.     DisposeWindow(gWindow);
  900. }
  901. Customizing Movie Controllers
  902.  
  903. Movie controller components allow you to create an action filter function in your application. The component calls your action filter function whenever an action occurs in the control. (An action is an integer constant used by the movie controller component.) You can then customize the behavior of the control or simply monitor user actions. You establish an action filter function by calling the MCSetActionFilterWithRefCon function, which is described on page 2-47.
  904. The sample code in Listing 2-2 demonstrates the use of an action filter function. This filter function resizes the window whenever the user hides the controller. Therefore, this sample function handles the mcActionControllerSizeChanged action. Your application should include a similar action filter function so that you can determine when the user resizes the controller. This function supports only attached controllers.
  905. Listing 2-2    Using a movie controller filter function
  906.  
  907. pascal Boolean myMCActionFilter ( MovieController mc, 
  908.                                             short* Action, long* params);
  909. {
  910.     RgnHandle                 controllerRgn;
  911.     Rect                 controllerBox;
  912.     WindowPtr                 movieWindow;
  913.     switch (*Action) {
  914.         case mcActionControllerSizeChanged:
  915.             /* size of controller/movie has changed */
  916.             movieWindow = (WindowPtr)MCGetControllerPort(mc);
  917.             controllerRgn = MCGetWindowRgn(mc, movieWindow);
  918.             if (controllerRgn != nil) {
  919.                 controllerBox = (**controllerRgn).rgnBBox;
  920.                 DisposeRgn (controllerRgn);
  921.                 SizeWindow (movieWindow, controllerBox.right,
  922.                                  controllerBox.bottom, true);
  923.             }
  924.         break;
  925.     }
  926.     return false;
  927. }
  928.  
  929.  
  930. Movie Controller Components Reference
  931.  
  932. This section describes some of the constants and functions associated with movie controller components.
  933. You can use the following constants to refer to the request codes for each of the functions that your movie controller component must support.    
  934. enum {
  935.     kMCSetMovieSelect                                         = 2,        /* MCSetMovie */
  936.     kMCRemoveMovieSelect                                         = 3,        /* MCRemoveMovie */
  937.     kMCIsPlayerEventSelect                                         = 7,        /* MCIsPlayerEvent */
  938.     kMCSetActionFilterSelect                                         = 8,        /* MCSetActionFilter */
  939.     kMCDoActionSelect                                         = 9,        /* MCDoAction */
  940.     kMCSetControllerAttachedSelect = 10,        
  941.                                                 /* MCSetControllerAttached */
  942.     kMCIsControllerAttachedSelect                                         = 11,        
  943.                                                 /* MCIsControllerAttached */
  944.     kMCSetControllerPortSelect                                         = 12,        /* MCSetControllerPort */
  945.     kMCGetControllerPortSelect                                         = 13,        /* MCGetControllerPort */
  946.     kMCGetVisibleSelect                                         = 14,        /* MCGetVisible */
  947.     kMCSetVisibleSelect                                        = 15,     /* MCSetVisible */
  948.     kMCGetControllerBoundsRectSelect     
  949.                                             = 16,    
  950.                                             /* MCGetControllerBoundsRect */
  951.     kMCSetControllerBoundsRectSelect     
  952.                                             = 17,    
  953.                                             /* MCSetControllerBoundsRect */
  954.     kMCGetControllerBoundsRgnSelect                                          = 18,
  955.                                             /* MCGetControllerBoundsRgn */
  956.     kMCGetWindowRgnSelect                                             = 19,        /* MCGetWindowRgn */
  957.     kMCMovieChangedSelect                                             = 20,        /* MCMovieChanged */
  958.     kMCSetDurationSelect                                             = 21,        /* MCSetDuration*/
  959.     kMCGetCurrentTimeSelect                                             = 22,        /* MCGetCurrentTime */
  960.     kMCNewAttachedControllerSelect                                             = 23,        
  961.                                             /* MCNewAttachedController */
  962.     kMCDrawSelect                                             = 24,        /* MCDraw */
  963.     kMCActivateSelect                                             = 25,        /* MCActivate */
  964.     kMCIdleSelect                                             = 26,        /* MCIdle */
  965.     kMCKeySelect                                             = 27,        /* MCKey */
  966.     kMCClickSelect                                             = 28,        /* MCClick */
  967.     kMCEnableEditingSelect                                             = 29,        /* MCEnableEditing */
  968.     kMCIsEditingEnabledSelect                                             = 30,        /* MCIsEditingEnabled */
  969.     kMCCopySelect                                             = 31,        /* MCCopy */
  970.     kMCCutSelect                                             = 32,        /* MCCut */
  971.     kMCPasteSelect                                             = 33,        /* MCPaste */ 
  972.     kMCClearSelect                                             = 34,        /* MCClear */
  973.     kMCUndoSelect                                             = 35,        /* MCUndo */
  974.     kMCPositionControllerSelect                                             = 36,        
  975.                                             /* MCPositionController */
  976.     kMCGetControllerInfoSelect                                             = 37,        
  977.                                             /* MCGetControllerInfo */
  978.     kMCSetClipSelect                                             = 40,        /* MCSetClip */
  979.     kMCGetClipSelect                                             = 41,        /* MCGetClip */
  980.     kMCDrawBadgeSelect                                             = 42        /* MCDrawBadge */
  981.     kMCSetUpEditMenuSelect                                            = 43,        /* MCSetUpEditMenu */,
  982.     kMCGetMenuStringSelect                                             = 44,        /* MCGetMenuString */
  983.     kMCSetActionFilterWithRefConSelect = 45                                    
  984.                                             /* MCSetActionFilterWithRefCon */
  985. };
  986. Movie Controller Actions
  987.  
  988. This section discusses actions, which are integer constants (defined by the mcAction data type) used by movie controller components. Applications that use movie controller components can invoke these actions by calling the MCDoAction function, 
  989. which is described on page 2-46. If your application includes an action filter function, that function may receive any of these actions (see the discussion of the MCSetActionFilterWithRefCon function on page 2-47 for more information about action filter functions). 
  990. Your action filter function should refer any actions that you do not want to handle back to the calling movie controller component. Your function refers actions back to the movie controller component by returning a value of false. If your function returns a value of true, the movie controller component performs no further processing for the action.
  991. If you use any Movie Toolbox functions that modify the movie in your action filter function, be sure to call the MCMovieChanged function (described on page 2-49).
  992. enum {
  993.     mcActionIdle                                         = 1,        /* give event-processing time to 
  994.                                                         movie controller */
  995.     mcActionDraw                                         = 2,        /* send update event to movie
  996.                                                         controller */
  997.     mcActionActivate                                         = 3,        /* activate movie controller */
  998.     mcActionDeactivate                                         = 4,        /* deactivate controller */
  999.     mcActionMouseDown                                         = 5,        /* pass mouse-down event */
  1000.     mcActionKey                                         = 6,        /* pass key-down or auto-key event */
  1001.     mcActionPlay                                         = 8,        /* start playing movie */
  1002.     mcActionGoToTime                                         = 12,        /* move to specific time in a movie */
  1003.     mcActionSetVolume                                         = 14,        /* set a movie's volume */
  1004.     mcActionGetVolume                                         = 15,        /* retrieve a movie's volume */
  1005.     mcActionStep                                         = 18,        /* play a movie a specified number
  1006.                                                         of frames at a time */
  1007.     mcActionSetLooping                                         = 21,        /* enable or disable looping */
  1008.     mcActionGetLooping                                         = 22,        /* find out if movie is looping  */
  1009.     mcActionSetLoopIsPalindrome                                         = 23,        /* enable palindrome looping */
  1010.     mcActionGetLoopIsPalindrome                                         = 24,        /* find out if palindrome looping
  1011.                                                         is on */
  1012.     mcActionSetGrowBoxBounds                                         = 25,        /* set limits for resizing a movie */
  1013.     mcActionControllerSizeChanged     = 26,                                            /* user has resized movie 
  1014.                                                         controller */
  1015.     mcActionSetSelectionBegin                                         = 29,     /* start time of movie's current
  1016.                                                         selection */
  1017.     mcActionSetSelectionDuration                                         = 30,        /* set duration of movie's current
  1018.                                                          selection     */
  1019.     mcActionSetKeysEnabled                                         = 32,        /* enable or disable keystrokes for
  1020.                                                         movie */
  1021.     mcActionGetKeysEnabled                                         = 33,        /* find out if keystrokes are 
  1022.                                                         enabled */
  1023.     mcActionSetPlaySelection                                         = 34,        /* constrain playing to the current
  1024.                                                         selection     */
  1025.     mcActionGetPlaySelection                                         = 35,        /* find out if movie is constrained to
  1026.                                                          playing within selection */
  1027.     mcActionSetUseBadge                                         = 36,        /* enable or disable movie's
  1028.                                                          playback badge */
  1029.     mcActionGetUseBadge                                         = 37,        /* find out if movie controller is
  1030.                                                         using playback badge */
  1031.     mcActionSetFlags                                         = 38,        /* set movie's control flags */
  1032.     mcActionGetFlags                                         = 39,        /* retrieve movie's control flags */
  1033.     mcActionSetPlayEveryFrame                                         = 40,        /* instruct controller to play all
  1034.                                                         frames in movie */
  1035.     mcActionGetPlayEveryFrame                                         = 41,        /* find out if controller is playing
  1036.                                                         every frame in movie */
  1037.     mcActionGetPlayRate                                         = 42,        /* determine playback rate */
  1038.     mcActionShowBalloon                                         = 43,        /* find out if controller wants to
  1039.                                                         display Balloon Help */
  1040.     mcActionBadgeClick                                         = 44,        /* user clicked movie's badge */
  1041.     mcActionMovieClick                                         = 45,        /* user clicked in movie *
  1042.     mcActionSuspend                                         = 46,        /* suspend event received */
  1043.     mcActionResume                                         = 47        /* resume event received */
  1044. typedef short mcAction;
  1045. };
  1046. The action descriptions that follow are divided into those used by your application and those received by your action filter.
  1047. Actions for Use by Applications
  1048. mcActionIdle
  1049. Your application can use this action to grant event-processing time to a movie controller.
  1050.     There are no parameters for this action.
  1051. mcActionDraw
  1052. Your application can use this action to send an update event to a movie controller. 
  1053.     The parameter for this action is a pointer to a window.
  1054. mcActionActivate 
  1055. Your application can use this action to activate a movie controller.
  1056.     There are no parameters for this action.
  1057. mcActionDeactivate
  1058. Your application can use this action to deactivate a movie controller. 
  1059.     There are no parameters for this action.
  1060. mcActionMouseDown
  1061. Your application can use this action to pass a mouse-down event to a movie controller.
  1062.     The parameter data must contain a pointer to an event structure—the message field in the event structure must specify the window in which the user clicked.
  1063. mcActionKey
  1064. Your application can use this action to pass a key-down or auto-key event to a movie controller.
  1065.     The parameter data must contain a pointer to an event structure that describes the key event.
  1066.     Your action filter function receives this action when the movie controller has received a key-down or auto-key event.
  1067. mcActionPlay 
  1068. Your application can use this action to start or stop playing a movie.
  1069.     The parameter data must contain a fixed value that indicates the rate 
  1070. of play. Values greater than 0 correspond to forward rates; values less than 0 play the movie backward. A value of 0 stops the movie.
  1071. mcActionGotoTime
  1072. Your application can use this action to move to a specific time in a movie.
  1073.     The parameter data must contain a pointer to a time structure that specifies the target position in the movie.
  1074. mcActionSetVolume
  1075. Your application can use this action to set a movie’s volume.
  1076.     The parameter data must contain a pointer to a 16-bit, fixed-point number that indicates the relative volume of the movie. Volume values range 
  1077. from –1.0 to 1.0. Negative values play no sound but preserve the absolute value of the volume setting.
  1078. mcActionGetVolume
  1079. Your application can use this action to determine a movie’s volume.
  1080.     The parameter data must contain a pointer to a 16-bit, fixed-point number that indicates the relative volume of the movie. Volume values range 
  1081. from –1.0 to 1.0. Negative values play no sound but preserve the absolute value of the volume setting.
  1082. mcActionStep
  1083. Your application can use this action to play a movie while skipping a specified number of frames at a time.
  1084.     The parameter data must contain a long integer value that specifies the number of steps (that is, the frames and the play direction). Positive values step the movie forward the specified number of frames; 
  1085. negative values step the movie backward. A value of 0 steps the movie forward one frame.
  1086. mcActionSetLooping
  1087. Your application can use this action to enable or disable looping for 
  1088. a movie.
  1089.     The parameter data must contain a Boolean value—a value of true indicates that looping is to be enabled.
  1090. mcActionGetLooping
  1091. Your application can use this action to determine whether a movie is looping.
  1092.     The parameter data must contain a pointer to a Boolean value. The movie controller sets this value to true if looping is enabled for the movie that is assigned to this controller. Otherwise, it sets the value to false.
  1093. mcActionSetLoopIsPalindrome 
  1094. Your application can use this action to enable palindrome looping. Palindrome looping causes a movie to play alternately forward and backward. Looping must also be enabled for palindrome looping to 
  1095. take effect.
  1096.     The parameter data must contain a Boolean value—a value of true indicates that palindrome looping is to be enabled.
  1097. mcActionGetLoopIsPalindrome
  1098. Your application can use this action to determine whether palindrome looping is enabled for a movie. Looping must also be enabled for palindrome looping to take effect.
  1099.     The parameter data must contain a pointer to a Boolean value. The movie controller sets this value to true if palindrome looping is enabled for the movie that is assigned to this controller. Otherwise, it sets the value 
  1100. to false. 
  1101. mcActionSetGrowBoxBounds
  1102. Your application can use this action to set the limits for resizing a movie.
  1103.     The parameter data consists of a rect structure.
  1104. mcActionSetSelectionBegin 
  1105. Your application can use this action to set the start time of a 
  1106. movie’s current selection. After using this action, you must use the mcActionSetSelectionDuration action to set the duration of 
  1107. the selection.
  1108.     The parameter data must contain a pointer to a time structure specifying the starting time of the movie’s current selection.
  1109. mcActionSetSelectionDuration 
  1110. Your application can use this action to set the duration of a movie’s current selection. You can only use this action immediately after the mcActionSetSelectionBegin action.
  1111.     The parameter data must contain a pointer to a time structure 
  1112. specifying the ending time of the movie’s current selection.
  1113.     Your action filter function receives this action when the movie controller has received a request to set the movie’s current selection duration.
  1114. mcActionSetKeysEnabled
  1115. Your application can use this action to enable or disable keystrokes 
  1116. for a movie.
  1117.     The parameter data must contain a Boolean value—a value of true indicates that keystrokes are to be enabled. By default, this value is 
  1118. set to false.
  1119. mcActionGetKeysEnabled
  1120. Your application can use this action to determine whether keystrokes are enabled for a movie controller.
  1121.     The parameter data must contain a pointer to a Boolean value. The movie controller sets this value to true if keystrokes are enabled for the movie that is assigned to this controller. Otherwise, it sets the value to false.
  1122. mcActionSetPlaySelection
  1123. Your application can use this action to constrain playing to the current selection. 
  1124.     The parameter data must contain a Boolean value—a value of true indicates that playing within the current selection is to be enabled.
  1125. mcActionGetPlaySelection
  1126. Your application can use this action to determine whether a movie has been constrained to playing within its selection. 
  1127.     The parameter data must contain a pointer to a Boolean value. The movie controller sets this value to true if playing is constrained to the current selection. Otherwise, it sets the value to false.
  1128. mcActionSetUseBadge
  1129. Your application can use this action to enable or disable a movie’s playback badge. If a controller’s badge is enabled, then the badge is displayed whenever the controller is not visible. When the controller is visible, the badge is not displayed. If the badge is disabled, the badge is never displayed.
  1130.     The parameter data must contain a Boolean value—a value of true indicates that the playback badge is to be enabled.
  1131. mcActionGetUseBadge
  1132. Your application can use this action to determine whether a controller is using a badge. If a controller’s badge is enabled, then the badge is displayed whenever the controller is not visible. When the controller is visible, the badge is not displayed. If the badge is disabled, the badge is never displayed.
  1133.     The parameter data must contain a pointer to a Boolean value. The movie controller sets this value to true if the controller is using a badge. Otherwise, it sets the value to false.
  1134. mcActionSetFlags
  1135. Your application can use this action to set a movie’s control flags.
  1136.     The parameter data must contain a long integer that contains the new control flag values. The following flags are defined:
  1137. mcFlagSuppressMovieFrame
  1138. Controls whether the controller displays a frame around the movie. If this flag is set to 1, the controller does not display a frame around the movie. By default, this flag is set to 0.
  1139. mcFlagSuppressStepButtons
  1140. Controls whether the controller displays the step buttons. The step buttons allow the user to step the movie forward or backward a frame at a time. If this flag is set to 1, the controller does not display the step buttons. By default, this flag is set to 0.
  1141. mcFlagSuppressSpeakerButton
  1142. Controls whether the controller displays the speaker button. The speaker button allows the user to control the movie’s sound. If this flag is set to 1, the controller does not display the speaker button. By default, this flag is set to 0.
  1143. mcActionGetFlags
  1144. Your application can use this action to retrieve a movie’s control flags.
  1145.     The parameter data must contain a pointer to a long integer. The movie controller places the movie’s control flags into that long integer. The following movie control flags are defined:
  1146. mcFlagSuppressMovieFrame
  1147. Controls whether the controller displays a frame around the movie. If this flag is set to 1, the controller does not display a frame around the movie. By default, this flag is set to 0.
  1148. mcFlagSuppressStepButtons
  1149. Controls whether the controller displays the step buttons. The step buttons allow the user to step the movie forward or backward a frame at a time. If this flag is set to 1, the movie controller does not display the step buttons. By default, this flag is set to 0.
  1150. mcFlagSuppressSpeakerButton
  1151. Controls whether the controller displays the speaker button. The speaker button allows the user to control the movie’s sound. If this flag is set to 1, the movie controller does not display the speaker button. By default, this flag is set to 0.
  1152. mcFlagsUseWindowPalette
  1153. Controls whether the controller manages the palette for the window containing the movie. This ensures that a movie’s colors are reproduced as accurately as possible. This flag is particularly useful for movies with custom color tables. If this flag is set to 1, the movie controller does not manage the window palette. By default, this flag is set to 0.
  1154. mcActionSetPlayEveryFrame
  1155. Your application can use this action to instruct the movie controller to play every frame in a movie. In this case, the movie controller may play the movie at a slower rate than you specify with the mcActionPlay action. However, the controller does not play the movie faster than the movie rate. In addition, the controller does not play the movie’s sound tracks.
  1156.     The parameter data must contain a Boolean value—a value of true instructs the controller to play every frame in the movie, even if that means playing the movie at a slower rate than you previously specified.
  1157. mcActionGetPlayEveryFrame
  1158. Your application can use this action to determine whether the 
  1159. movie controller has been instructed to play every frame in a movie. 
  1160. You tell the controller to play every frame by using the mcActionSetPlayEveryFrame action, which is described earlier in this section.
  1161.     The parameter data must contain a pointer to a Boolean value—the movie controller sets this value to true if the controller has been instructed to play every frame in the movie, even if that means playing the movie at a slower rate than you previously specified. Otherwise, the controller sets the value to false.
  1162. mcActionSetGrowBoundsBox
  1163. The parameter data must contain a pointer to a rectangle—set the rectangle to the boundary coordinates for the movie. If you want to prevent the movie from being resized, supply an empty rectangle (note that enabling or disabling the size box may change the appearance of some movie controllers). By default, movie controllers do not have size boxes. You must use this action to establish a size box for a movie controller.
  1164.     If the movie controller’s boundary rectangle intersects the lower-right corner of your window, your window cannot have a size box.
  1165. mcActionGetPlayRate
  1166. Your application can use this action to determine a movie’s playback 
  1167. rate. You set the playback rate when you start a movie playing by using the mcActionPlay action.
  1168.     The parameter data must contain a pointer to a fixed value. The movie controller returns the movie’s playback rate in that fixed value. Values greater than 0 correspond to forward rates; values less than 0 play the movie backward. A value of 0 indicates that the movie is stopped.
  1169. mcActionBadgeClick
  1170. Indicates that the badge was clicked. The parameter is a pointer to a Boolean value. On entry, the Boolean is set to true. Set the Boolean to false if you want the controller to ignore the click in the badge.
  1171. mcActionMovieClick
  1172. Indicates that the movie was clicked. The parameter is a pointer to an event structure containing the mouse-down event. If you want the controller to ignore the mouse-down event, change the what field of the event structure to a null event.
  1173. mcActionSuspend
  1174. Indicates that a suspend event has been received. There is no parameter.
  1175. mcActionResume
  1176. Indicates that a resume event has been received. There is no parameter.
  1177. Actions for Use by Action-Filter Functions
  1178. mcActionIdle
  1179. Your action filter function receives this action when the application has granted null event-processing time to the movie controller.
  1180.     There are no parameters for this action.
  1181. mcActionDraw
  1182. Your filter function receives this action when the controller has received an update event.
  1183.     The parameter for this action is a pointer to a window.
  1184. mcActionActivate 
  1185. Your filter function receives this action when the controller has received an activate or resume event. 
  1186.     There are no parameters for this action.
  1187. mcActionDeactivate
  1188. Your filter function receives this action when the controller has received a deactivate or suspend event. 
  1189.     There are no parameters for this action.
  1190. mcActionMouseDown
  1191. Your action filter function receives this action when the movie controller has received a mouse-down event.
  1192.     The parameter data must contain a pointer to an event structure—the message field in the event structure must specify the window in which the user clicked.
  1193. mcActionKey
  1194. Your action filter function receives this action when the movie controller has received a key-down or auto-key event.
  1195.     The parameter data must contain a pointer to an event structure that describes the key event.
  1196. mcActionPlay
  1197. Your action filter receives this action when the movie controller has received a request to start or stop playing a movie.
  1198.     The parameter data must contain a fixed value that indicates the rate 
  1199. of play. Values greater than 0 correspond to forward rates; values less than 0 play the movie backward. A value of 0 stops the movie.
  1200. mcActionGotoTime
  1201. Your action filter function receives this action when the movie controller has received a request to go to a specified time in the movie.
  1202.     The parameter data must contain a pointer to a time structure that specifies the target position in the movie.    
  1203. mcActionSetVolume
  1204. Your action filter function receives this action when the movie controller has received a request to set the movie’s volume.
  1205.     The parameter data must contain a pointer to a 16-bit, fixed-point number that indicates the relative volume of the movie. Volume values range 
  1206. from –1.0 to 1.0. Negative values play no sound but preserve the absolute value of the volume setting.
  1207. mcActionGetVolume
  1208. Your action filter function receives this action when the movie controller has received a request to retrieve the movie’s volume.
  1209.     The parameter data must contain a pointer to a 16-bit, fixed-point number that indicates the relative volume of the movie. Volume values range 
  1210. from –1.0 to 1.0. Negative values play no sound but preserve the absolute value of the volume setting.
  1211. mcActionStep
  1212. Your action filter function receives this action when the movie controller has received a request to play a movie while advancing a specified number of frames at a time.
  1213.     The parameter data must contain a long integer value that specifies the number of steps (that is, the frames and the play direction). Positive values step the movie forward the specified number of frames; 
  1214. negative values step the movie backward. A value of 0 steps the movie forward one frame.
  1215. mcActionSetLooping
  1216. Your action filter function receives this action when the movie controller has received a request to turn looping on or off.
  1217.     The parameter data must contain a Boolean value—a value of true indicates that looping is to be enabled.
  1218. mcActionGetLooping
  1219. Your action filter function receives this action when the controller has received a request to indicate whether looping is enabled for its movie.
  1220.     The parameter data must contain a pointer to a Boolean value. The movie controller sets this value to true if looping is enabled for the movie that is assigned to this controller. Otherwise, it sets the value to false.
  1221. mcActionSetLoopIsPalindrome 
  1222. Your action filter function receives this action when the movie controller has received a request to turn palindrome looping on or off. Palindrome looping causes a movie to play alternately forward and backward. Looping must also be enabled for palindrome looping to take effect.
  1223.     The parameter data must contain a Boolean value—a value of true indicates that palindrome looping is to be enabled.
  1224. mcActionGetLoopIsPalindrome
  1225. Your action filter function receives this action when the controller has received a request to indicate whether palindrome looping is enabled for its movie.
  1226.     The parameter data must contain a pointer to a Boolean value. The 
  1227. movie controller sets this value to true if palindrome looping is enabled for the movie that is assigned to this controller. Otherwise, it sets the value to false. 
  1228. mcActionControllerSizeChanged
  1229.     Your filter function receives this action when the user has resized the movie controller—the controller component issues this action before it updates the screen, allowing your application to change the controller’s location or appearance before the user sees the resized controller. 
  1230.     There are no parameters for this action.
  1231. Note
  1232. Your application should never use this action.u
  1233. mcActionSetSelectionBegin 
  1234. Your action filter function receives this action when the movie controller has received a request to set the movie’s current selection start time.
  1235.     The parameter data must contain a pointer to a time structure specifying the starting time of the movie’s current selection.
  1236. mcActionSetSelectionDuration
  1237. Your action filter function receives this action when the movie controller has received a request to set the movie’s current selection duration.
  1238.     The parameter data must contain a pointer to a time structure 
  1239. specifying the ending time of the movie’s current selection.
  1240. mcActionSetKeysEnabled
  1241. Your action filter function receives this action when the movie controller has received a request to enable or disable keystrokes.
  1242.     The parameter data must contain a Boolean value—a value of true indicates that keystrokes are to be enabled. By default, this value is 
  1243. set to false.
  1244. mcActionGetKeysEnabled
  1245. Your filter function receives this action when the controller has received a request to indicate whether keystrokes are enabled for its movie.
  1246.     The parameter data must contain a pointer to a Boolean value. The movie controller sets this value to true if keystrokes are enabled for the movie that is assigned to this controller. Otherwise, it sets the value to false.
  1247. mcActionSetPlaySelection
  1248. Your action filter function receives this action when the movie controller has received a request to constrain playing to the current selection.
  1249.     The parameter data must contain a Boolean value—a value of true indicates that playing within the current selection is to be enabled.
  1250. mcActionGetPlaySelection
  1251. Your action filter function receives this action when the movie controller has received a request to indicate whether playing is constrained to the current selection.
  1252.     The parameter data must contain a pointer to a Boolean value. The movie controller sets this value to true if playing is constrained to the current selection. Otherwise, it sets the value to false.
  1253. mcActionSetUseBadge
  1254. Your action filter function receives this action when the movie controller has received a request to turn the playback badge on or off. 
  1255.     The parameter data must contain a Boolean value—a value of true indicates that the playback badge is to be enabled.
  1256. mcActionGetUseBadge
  1257. Your action filter function receives this action when the controller has received a request to indicate whether it is using a badge during playback.
  1258.     The parameter data must contain a pointer to a Boolean value. The movie controller sets this value to true if the controller is using a badge. Otherwise, it sets the value to false.
  1259. mcActionSetFlags
  1260. Your action filter function receives this action when the movie controller has received a request to set the movie’s control flags.
  1261.     The parameter data must contain a long integer that contains the new control flag values. The following flags are defined:
  1262. mcFlagSuppressMovieFrame
  1263. Controls whether the controller displays a frame around the movie. If this flag is set to 1, the controller does not display a frame around the movie. By default, this flag is set to 0.
  1264. mcFlagSuppressStepButtons
  1265. Controls whether the controller displays the step buttons. The step buttons allow the user to step the movie forward or backward a frame at a time. If this flag is set to 1, the controller does not display the step buttons. By default, this flag is set to 0.
  1266. mcFlagSuppressSpeakerButton
  1267. Controls whether the controller displays the speaker button. The speaker button allows the user to control the movie’s sound. If this flag is set to 1, the controller does not display the speaker button. By default, this flag is set to 0.
  1268. mcActionGetFlags
  1269. Your action filter function receives this action when the movie controller has received a request to retrieve the movie’s control flags.
  1270.     The parameter data must contain a pointer to a long integer. The movie controller places the movie’s control flags into that long integer. The following movie control flags are defined:
  1271. mcFlagSuppressMovieFrame
  1272. Controls whether the controller displays a frame around the movie. If this flag is set to 1, the controller does not display a frame around the movie. By default, this flag is set to 0.
  1273. mcFlagSuppressStepButtons
  1274. Controls whether the controller displays the step buttons. The step buttons allow the user to step the movie forward or backward a frame at a time. If this flag is set to 1, the movie controller does not display the step buttons. By default, this flag is set to 0.
  1275. mcFlagSuppressSpeakerButton
  1276. Controls whether the controller displays the speaker button. The speaker button allows the user to control the movie’s sound. If this flag is set to 1, the movie controller does not display the speaker button. By default, this flag is set to 0.
  1277. mcFlagsUseWindowPalette
  1278. Controls whether the controller manages the palette for the window containing the movie. This ensures that a movie’s colors are reproduced as accurately as possible. This flag is particularly useful for movies with custom color tables. If this flag is set to 1, the movie controller does not manage the window palette. By default, this flag is set to 0.
  1279. mcActionSetPlayEveryFrame
  1280. Your action filter function receives this action when the movie controller has received a request to play every frame in a movie.
  1281.     The parameter data must contain a Boolean value—a value of true instructs the controller to play every frame in the movie, even if that means playing the movie at a slower rate than you previously specified.
  1282. mcActionGetPlayEveryFrame
  1283. Your action filter function receives this action when the movie controller has received a request to indicate whether it has been instructed to play every frame in a movie.
  1284.     The parameter data must contain a pointer to a Boolean value—the movie controller sets this value to true if the controller has been instructed to play every frame in the movie, even if that means playing the movie at a slower rate than you previously specified. Otherwise, the controller sets the value to false.
  1285. mcActionSetGrowBoundsBox
  1286.     Your action filter function receives this action when the movie controller has received a request to set the limits for resizing the movie.
  1287.     The parameter data contains a pointer to a rectangle—the rectangle defines the boundary coordinates for the movie. If the rectangle is empty, the application wants to disable the size box. You may change the appearance of your controller in response to such a request.
  1288. mcActionShowBalloon
  1289.     Your action filter function receives this action when the controller wants to display Balloon Help. Your filter function instructs the controller whether to display the Balloon Help. This action allows you to override the movie controller’s default Balloon Help behavior.
  1290.     The parameter data contains a pointer to a Boolean value. Set the value to true to display the appropriate Balloon Help. Otherwise, set the value to false.
  1291. Note
  1292. Your application should never use this action.u
  1293. Movie Controller Functions
  1294.  
  1295. This section describes the functions that are supported by movie controller components. It is divided into the following topics:
  1296. n    “Associating Movies With Controllers,” which describes the movie controller component functions that allow applications to assign movies to controllers
  1297. n    “Managing Controller Attributes,” which discusses the movie controller component functions that allow applications to alter the display characteristics of the controller
  1298. n    “Handling Movie Events,” which discusses the movie controller component functions that applications use to handle movie actions
  1299. n    “Editing Movies,” which describes the movie controller component functions that help applications edit movies
  1300. n    “Getting and Setting Movie Controller Time,” which discusses the movie component controller functions that allow applications to get and set movie controller time information
  1301. n    “Customizing Event Processing,” which describes movie controller component functions that allow applications to perform customized event processing
  1302. These functions are discussed from the perspective of the developer of an application that uses movie controllers. If you are developing a movie controller component, your component must behave as described here.
  1303. Associating Movies With Controllers
  1304.  
  1305. Once your application has established a connection to a movie controller component, you may associate one movie with a movie controller. By default, the new controller has editing and keystroke processing turned off.
  1306. You create a new movie controller and assign it to a movie by calling the NewMovieController function. This is the easiest way to use a movie controller component.
  1307. If you want to exert more control over the assignment of movies to controllers, you can use other movie controller functions. If you want to assign a movie to an existing controller, you can use the MCNewAttachedController function. Use the MCSetMovie function to assign a movie to or remove a movie from a controller. You can use the MCGetMovie function to retrieve a reference to the movie that is assigned to a controller.
  1308. When you are done with a controller, use the DisposeMovieController function to dispose of the controller.
  1309. NewMovieController
  1310.  
  1311. The NewMovieController function locates a movie controller component for you and assigns a movie to that controller. This function always creates a controller that is attached to a movie.
  1312. This function is actually implemented by the Movie Toolbox, not by movie controller components. If you are creating your own movie controller component, you do not need to support this function.
  1313. pascal MovieController NewMovieController (Movie theMovie,
  1314.                                                     const Rect *movieRect, 
  1315.                                                     long someFlags);
  1316. theMovie    Identifies the movie to be associated with the movie controller.
  1317. movieRect    Points to the display rectangle that is to contain the movie and its controller.
  1318. someFlags    Contains flags that control the operation. If you set these flags to 0, the movie controller component centers the movie in the rectangle specified by the movieRect parameter and scales the movie to fit in that rectangle. The control portion of the controller is also placed within that rectangle. You may control how the movie and the control are drawn by setting one or more of the following flags to 1:
  1319. mcTopLeftMovie
  1320. If this flag is set to 1, the movie controller component places the movie into the upper-left corner of the display rectangle specified by the movieRect parameter. The component scales the movie to fit into the rectangle. Note that the control portion of the controller may fall outside of the rectangle, depending upon the results of the scaling operation. 
  1321. mcScaleMovieToFit
  1322. If this flag is set to 1, the movie controller component resizes the movie to fit into the display rectangle specified by the movieRect parameter after it places the control portion of the controller into the rectangle.
  1323.     If you set this flag and the mcScaleMovieToFit flag to 1, the movie controller component resizes the movie to fit 
  1324. into the specified rectangle and places the control portion of the controller outside of the rectangle.
  1325. mcWithBadge
  1326. Controls whether the movie controller uses a badge (see “Badges,” which begins on page 2-6, for more information about movie badges). If you set this flag to 1, the movie controller component displays the movie with a badge whenever the controller portion is not displayed. If you set this flag to 0, the movie controller component does not use a badge.
  1327. mcNotVisible
  1328. Controls whether the controller portion is visible. If you set this flag to 0, the movie controller component displays the controller along with the movie. If you set this flag to 1, the component does not display the controller. If you have set the mcWithBadge flag to 1, specifying that the component uses a badge, the component displays a badge whenever the controller is not visible. 
  1329. mcWithFrame
  1330. Specifies whether the component displays a frame 
  1331. around the movie as part of the controller. If you set this flag to 1, the component displays a frame around the movie, including the movie’s name. If you set this flag to 0, the component does not display a frame as part of the controller.
  1332. DESCRIPTION
  1333. The NewMovieController function returns a movie controller identifier value. This value identifies a connection to a movie controller component, and it is a component instance.
  1334. MCNewAttachedController
  1335.  
  1336. The MCNewAttachedController function associates a specified movie with a movie controller. 
  1337. pascal ComponentResult MCNewAttachedController (MovieController
  1338.                                                              mc, Movie theMovie,
  1339.                                                              WindowPtr w,
  1340.                                                              Point where);
  1341. mc    Specifies the movie controller for the operation. You obtain this 
  1342. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function.
  1343. theMovie    Identifies the movie to be associated with the movie controller.
  1344. w    Identifies the window in which the movie is to be displayed. The movie controller component sets the movie’s graphics world to match this window. If you set the w parameter to nil, the component uses the current window.
  1345. where    Specifies the upper-left corner of the movie within the window specified by the w parameter. The movie controller component uses the movie’s boundary rectangle to determine the size of the movie (the Movie Toolbox’s GetMovieBox function returns this rectangle). 
  1346. DESCRIPTION
  1347. The MCNewAttachedController function forces the controller to be attached to the movie and sets the controller to be visible. 
  1348. MCSetMovie
  1349.  
  1350. The MCSetMovie function associates a movie with a specified movie controller.
  1351. pascal ComponentResult MCSetMovie (MovieController mc, 
  1352.                                                 Movie theMovie,
  1353.                                                 WindowPtr movieWindow, 
  1354.                                                 Point where);
  1355. mc    Specifies the movie controller for the operation. You obtain this 
  1356. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1357. theMovie    Identifies the movie to be associated with the movie controller. Set this value to nil to remove the movie from the controller.
  1358. movieWindow
  1359. Identifies the window in which the movie is to be displayed. The movie controller component sets the movie’s graphics world to match this window. If you set the w parameter to nil, the component uses the current window.
  1360. where    Specifies the upper-left corner of the movie within the window specified by the movieWindow parameter. The movie controller component uses the movie’s boundary rectangle to determine the size of the movie (the Movie Toolbox’s GetMovieBox function returns this rectangle).
  1361. DESCRIPTION
  1362. You can also use the MCSetMovie function to remove a movie from its controller.
  1363. SEE ALSO
  1364. If you want to scale the movie, call the Movie Toolbox’s SetMovieBox function (described in Inside Macintosh: QuickTime) before calling MCSetMovie.
  1365. MCGetMovie
  1366.  
  1367. The MCGetMovie function allows your application to retrieve the movie reference for a movie that is associated with a movie controller. The movie controller component returns the movie’s identifier value.
  1368. pascal Movie MCGetMovie (MovieController mc);
  1369. mc    Specifies the movie controller for the operation. You obtain this identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1370. DESCRIPTION
  1371. The MCGetMovie function returns the movie identifier for the movie that is assigned to the specified controller. If there is no movie assigned to the controller, the returned movie identifier is set to nil.
  1372. DisposeMovieController
  1373.  
  1374. The DisposeMovieController function disposes of a movie controller. Your application is responsible for disposing of the movie that is associated with the movie controller. Do not dispose of the movie before disposing of the controller.
  1375. pascal void DisposeMovieController (MovieController mc);
  1376. mc    Specifies the movie controller for the operation. You obtain this 
  1377. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1378. DESCRIPTION
  1379. The DisposeMovieController function is implemented by the Movie Toolbox, not by movie controller components. If you are creating your own movie controller component, you do not have to support this function.
  1380. Managing Controller Attributes
  1381.  
  1382. Movie controller components provide a number of functions that allow your application to control the display attributes of a movie controller. For example, you can detach the controller from its movie, so that the controller and movie can be managed as separate graphics entities. In addition, movie controller components provide a number of functions that allow you to work with a controller’s boundary rectangles and regions. For a complete discussion of these rectangles and regions, see “Spatial Properties,” which begins on page 2-6.
  1383. The MCSetControllerAttached function lets you control whether the movie controller is attached to its movie. The MCIsControllerAttached function allows you to determine if a controller is attached to its movie.
  1384. You can use the MCSetControllerPort and MCGetControllerPort functions to work a movie controller’s graphics port.
  1385. The MCSetVisible and MCGetVisible functions enable you to control the visibility of the movie controller.
  1386. The MCSetControllerBoundsRect and MCGetControllerBoundsRect functions help you work with a movie controller’s boundary rectangle. You can use the MCGetControllerBoundsRgn and MCGetControllerWindowRgn functions if the controller is not rectangular. You can position a controller and its movie separately by calling the MCPositionController function.
  1387. MCPositionController
  1388.  
  1389. The MCPositionController function allows you to control the position of a movie and its controller on the computer display. 
  1390. pascal ComponentResult MCPositionController (MovieController mc,
  1391.                                                     const Rect *movieRect, 
  1392.                                                     const Rect     *controllerRect,
  1393.                                                     long someFlags);
  1394. mc    Specifies the movie controller for the operation. You obtain this 
  1395. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1396. movieRect    Points to a Rect structure that specifies the coordinates of the movie’s boundary rectangle. (For details on the Rect structure, see the chapter “Basic QuickDraw” in Inside Macintosh: Imaging.)
  1397. controllerRect
  1398. Points to a Rect structure that specifies the coordinates of the controller’s boundary rectangle. The movie controller component always centers the control portion of the controller inside this rectangle. The movie controller component only uses this parameter when the control portion of the controller is detached from the movie. If you are working with an attached controller, you can set this parameter to nil.
  1399. someFlags    If you set these flags to 0, the movie controller component centers the movie in the rectangle specified by movieRect and scales the movie to fit in that rectangle. You may control how the movie is drawn by setting one or more of the following flags to 1:
  1400. mcTopLeftMovie
  1401. If this flag is set to 1, the movie controller component places the movie into the upper-left corner of the display rectangle specified by the movieRect parameter. The component scales the movie to fit into the rectangle. Note that the control portion of the controller may fall outside of the rectangle, depending upon the results of the scaling operation. 
  1402. mcScaleMovieToFit
  1403. If this flag is set to 1, the movie controller component resizes the movie to fit into the display rectangle specified by the movieRect parameter after it places the control portion of the controller into the rectangle.
  1404.     If you set this flag and the mcTopLeftMovie flag to 1, the movie controller component resizes the movie to fit into the specified rectangle and places the control portion of the controller outside of the rectangle.
  1405. mcPositionDontInvalidate
  1406. If this flag is set to 1, the movie controller component is requested not to invalidate areas of the window that are changed as a result of repositioning the movie or the controller. This flag is useful for applications that use the movie controller as part of a larger document. In particular, if the document is scrolled using QuickDraw’s ScrollRect routine, optimal redrawing occurs 
  1407. (that is, scrolled areas are not redrawn) if this flag is set. For details on ScrollRect, see the chapter “Basic QuickDraw” in Inside Macintosh: Imaging.
  1408. DESCRIPTION
  1409. The MCPositionController function works with controllers that are attached to movies and controllers that are not attached to movies.
  1410. MCSetControllerAttached
  1411.  
  1412. The MCSetControllerAttached function allows your application to control whether a movie controller is attached to its movie or detached from it. “About Movie Controller Components,” which begins on page 2-4, discusses the differences between attached and detached movie controllers. 
  1413. pascal ComponentResult MCSetControllerAttached 
  1414.                                                     (MovieController mc,
  1415.                                                      Boolean attach);
  1416. mc    Specifies the movie controller for the operation. You obtain this identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1417. attach    Specifies the action for this function. Set the attach parameter to true to cause the controller to be attached to its movie. Set this parameter to false to detach the controller from its movie.
  1418. DESCRIPTION
  1419. By default, a new movie controller is attached to its movie.
  1420. SPECIAL CONSIDERATIONS
  1421. Your application should not make any assumptions about the location of an attached movie controller with respect to its movie. The controller may be above, below, or surrounding the movie image. 
  1422. SEE ALSO
  1423. If you need to know the location of the controller, you can use the MCGetControllerBoundsRect function, described on page 2-39, to obtain its boundary rectangle.
  1424. MCIsControllerAttached
  1425.  
  1426. The MCIsControllerAttached function returns a value that indicates whether a movie controller is attached to its movie. 
  1427. pascal ComponentResult MCIsControllerAttached 
  1428.                                                         (MovieController mc);
  1429. mc    Specifies the movie controller for the operation. You obtain this 
  1430. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1431. DESCRIPTION
  1432. The MCIsControllerAttached function returns a ComponentResult value 
  1433. that indicates whether a movie controller is attached to its movie. If the controller is attached, the returned value is set to 1. If the controller is not attached, the returned value is set to 0.
  1434. SEE ALSO
  1435. You can use the MCSetControllerAttached function, described in the previous section, to attach or detach a movie controller.
  1436. MCSetVisible
  1437.  
  1438. The MCSetVisible function allows your application to control the visibility of a movie controller. 
  1439. pascal ComponentResult MCSetVisible (MovieController mc, 
  1440.                                                  Boolean visible);
  1441. mc    Specifies the movie controller for the operation. You obtain this identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1442. visible    Specifies the action for this function. Set the visible parameter to true to cause the controller to be visible. Set this parameter to false to make the controller invisible.
  1443. DESCRIPTION
  1444. Movie controller components support badges, which allow you to create a visual 
  1445. cue that helps the user distinguish between static images and images that represent movies. The movie controller component displays a badge in the movie image whenever the movie is visible but the control portion of the controller is not visible. To work with movie controller badges, you must use the mcActionSetUseBadge action, which is described in “Movie Controller Actions” beginning on page 2-15.
  1446. SPECIAL CONSIDERATIONS
  1447. By default, a new controller is hidden so that your application can freely set the display attributes before showing the controller to the user. You should note, however, that the MCNewAttachedController function (described on page 2-30) automatically sets the movie controller to be visible. Your application must make the controller visible before the user can work with its associated movie.
  1448. SEE ALSO
  1449. You can use the MCGetVisible function, described in the next section, to determine the visibility of a movie controller.
  1450. MCGetVisible
  1451.  
  1452. The MCGetVisible function returns a value that indicates whether a movie controller is visible. 
  1453. pascal ComponentResult MCGetVisible (MovieController mc);
  1454. mc    Specifies the movie controller for the operation. You obtain this 
  1455. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1456. DESCRIPTION
  1457. The MCGetVisible function returns a ComponentResult value that indicates whether a movie controller is visible. If the controller is visible, the returned value is set to 1. If the controller is not showing, the returned value is set to 0.
  1458. SEE ALSO
  1459. Use the MCSetVisible function, described in the previous section, to change the visibility of a movie controller.
  1460. MCDrawBadge
  1461.  
  1462. The MCDrawBadge function allows you to display a controller’s badge. This function places the badge in an appropriate location based on the location of the controller’s movie.
  1463. pascal ComponentResult MCDrawBadge (MovieController mc,
  1464.                                                 RgnHandle movieRgn, 
  1465.                                                 RgnHandle *badgeRgn);
  1466. mc    Specifies the movie controller for the operation. You obtain this 
  1467. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1468. movieRgn    Specifies the boundary region of the controller’s movie.
  1469. badgeRgn    Points to a region that is to receive information about the location of the badge—your application must dispose of this handle. The movie controller returns the region where the badge is displayed. If you are not interested in this information, you may set this parameter to nil.
  1470. DESCRIPTION
  1471. The MCDrawBadge function can be useful in circumstances where you are using a movie controller component but do not want to incur the overhead of having the QuickTime movie in memory all the time. This function allows you to display the badge without having to display the movie. In addition, you can use the badge region to perform mouse-down event testing.
  1472. MCSetControllerBoundsRect
  1473.  
  1474. The MCSetControllerBoundsRect function lets you change the position and size of a movie controller. A controller’s boundary rectangle encloses the control portion of the controller. In addition, in cases where the movie is attached to the controller, the boundary rectangle also encloses the movie. Note that changing the size of the boundary rectangle may result in the movie being resized as well, if the movie is attached to the controller. 
  1475. pascal ComponentResult MCSetControllerBoundsRect
  1476.                                                          (MovieController mc,
  1477.                                                             const Rect *bounds);
  1478. mc    Specifies the movie controller for the operation. You obtain this 
  1479. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1480. bounds    Points to a rectangle structure that contains the new boundary rectangle for the movie controller.
  1481. DESCRIPTION
  1482. Movie controller components can reject your request for a number of reasons. For example, some movie controller components may support only fixed-size controllers or controllers whose size is fixed in one dimension. Also, note that your application cannot change the location of an attached controller. 
  1483. The movie controller component returns a value of controllerBoundsNotExact if the boundary rectangle has been changed but does not correspond to the rectangle you specified. In this case, the new boundary rectangle is always smaller than the requested rectangle. 
  1484. RESULT CODEScontrollerBoundsNotExact    –9996    Controller has altered the bounds you supplied    
  1485. controllerHasFixedHeight    –9998    You cannot change the height of this controller    
  1486. cannotMoveAttachedController    –9999    You cannot move an attached controller    
  1487.  
  1488. SEE ALSO
  1489. To find the dimensions of the new boundary rectangle, call the MCGetControllerBoundsRect function, described in the next section. 
  1490. MCGetControllerBoundsRect
  1491.  
  1492. The MCGetControllerBoundsRect function returns a movie controller’s boundary rectangle. This rectangle reflects the size and location of the controller even if the controller is currently hidden. If the controller is detached from its movie, the rectangle encompasses only the controller, not the movie. If the controller is attached to its movie, the rectangle encompasses both the controller and the movie. 
  1493. pascal ComponentResult MCGetControllerBoundsRect
  1494.                                                              (MovieController mc, 
  1495.                                                              Rect *bounds);
  1496. mc    Specifies the movie controller for the operation. You obtain this 
  1497. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1498. bounds    Contains a pointer to a rect structure that is to receive the coordinates of the movie controller’s boundary rectangle. If there is insufficient screen space to display the controller, the function may return an empty rectangle.
  1499. DESCRIPTION
  1500. The returned rectangle is the boundary rectangle for the region occupied by the controller and its movie (if the movie is attached to the controller), even if the controller is not rectangular.
  1501. SPECIAL CONSIDERATIONS
  1502. Note that if the controller cannot obtain enough screen space, the movie controller component may return an empty rectangle.
  1503. SEE ALSO
  1504. You can use the MCGetControllerBoundsRgn function, described in the next section, to obtain the boundary region for a controller. You can use the MCGetWindowRgn function, described on page 2-41, to determine the portion of the window that is currently in use by the controller.
  1505. MCGetControllerBoundsRgn
  1506.  
  1507. Some movie controllers may not be rectangular in shape. The MCGetControllerBoundsRgn function returns the actual region occupied by the controller and its movie, if the movie is attached to the controller. If the movie is not attached to its controller, the boundary region encloses only the control portion of the controller. The rectangle returned by the MCGetControllerBoundsRect function (described in the previous section) bounds the region returned by MCGetControllerBoundsRgn. 
  1508. pascal RgnHandle MCGetControllerBoundsRgn (MovieController mc);
  1509. mc    Specifies the movie controller for the operation. You obtain this 
  1510. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function.
  1511. DESCRIPTION
  1512. As with the MCGetControllerBoundsRect function, the MCGetControllerBoundsRgn function returns a region that reflects the size, shape, and location of the controller, even if the controller is hidden. Your application must dispose of the returned region.
  1513. The MCGetControllerBoundsRgn function returns a handle to the boundary region. Your application must dispose of this region.
  1514. RESULT CODES
  1515. Memory Manager errors
  1516. SEE ALSO
  1517. You can use the MCGetWindowRgn function, described in the next section, to determine the portion of the window that is currently in use by the controller.
  1518. MCGetWindowRgn
  1519.  
  1520. The MCGetWindowRgn function allows your application to determine the window region that is actually in use by a controller and its movie. The region returned by this function contains only the visible portions of the controller and its movie.
  1521. pascal RgnHandle MCGetWindowRgn (MovieController mc, WindowPtr w);
  1522. mc    Specifies the movie controller for the operation. You obtain this identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1523. w    Identifies the window in which the movie controller and its movie are displayed, if the control portion of the controller is attached to the movie. If the controller is detached and in a separate window from the movie, specify one of the windows.
  1524. DESCRIPTION
  1525. The returned region may consist of several discontiguous areas. For example, if a controller is detached from its movie, the window region may define separate areas for the movie and the controller. If you want to consider just the controller, you must subtract the movie from the returned region.
  1526. Your application must dispose of the returned region.
  1527. The MCGetWindowRgn function returns a handle to the window region. Your application must dispose of this region. 
  1528. RESULT CODES
  1529. Memory Manager errors
  1530. SEE ALSO
  1531. You can control the clipping region that is applied to the controller by calling the MCSetClip function, which is described in the next section.
  1532. MCSetClip
  1533.  
  1534. The MCSetClip function allows you to set a movie controller’s clipping region. This clipping region is equivalent to the movie display clipping region supported by the Movie Toolbox. 
  1535. pascal ComponentResult MCSetClip (MovieController mc, 
  1536.                                              RgnHandle theClip, 
  1537.                                              RgnHandle movieClip);
  1538. mc    Specifies the movie controller for the operation. You obtain this 
  1539. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1540. theClip    Contains a handle to a region that defines the controller’s clipping region. This clipping region affects the entire movie controller and its movie, including the controller’s badge and associated controls. Set this parameter to nil to clear the controller’s clipping region.
  1541. movieClip    Contains a handle to a region that defines the clipping region of the controller’s movie. This clipping region affects only the movie and the badge, not the movie controller. Set this parameter to nil to clear the movie clipping region.
  1542. DESCRIPTION
  1543. Your application must dispose of the regions you supply to the MCSetClip function.
  1544. SPECIAL CONSIDERATIONS
  1545. Do not use the Movie Toolbox’s SetMovieDisplayClipRgn function to modify movies that are associated with movie controllers.
  1546. RESULT CODES
  1547. Memory Manager errors
  1548. SEE ALSO
  1549. You can retrieve information about a controller’s clipping information by calling the MCGetClip function, which is described in the next section.
  1550. MCGetClip
  1551.  
  1552. The MCGetClip function allows you to obtain information describing a movie controller’s clipping regions.
  1553. pascal ComponentResult MCGetClip (MovieController mc, 
  1554.                                              RgnHandle *theClip, 
  1555.                                              RgnHandle *movieClip);
  1556. mc    Specifies the movie controller for the operation. You obtain this 
  1557. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1558. theClip    Contains a pointer to a field that is to receive a handle to the clipping region of the entire movie controller. You must dispose of this region when you are done with it. If you are not interested in this information, you may set this parameter to nil.
  1559. movieClip    Contains a pointer to a field that is to receive a handle to the clipping region of the controller’s movie. You must dispose of this region when you are done with it. If you are not interested in this information, you may set this parameter to nil.
  1560. RESULT CODES
  1561. Memory Manager errors
  1562. SEE ALSO
  1563. You can set a controller’s clipping information by calling the MCSetClip function, which is described in the previous section.
  1564. MCSetControllerPort
  1565.  
  1566. The MCSetControllerPort function allows your application to set the graphics port for a movie controller. You can use this function to place a movie and its associated movie controller in different graphics ports. If you are using an attached controller, both the controller and the movie’s graphics ports are changed. If you are using a detached controller, this function changes only the graphics port of the control portion of 
  1567. the controller. You must use the Movie Toolbox’s SetMovieGWorld function followed by the MCMovieChanged function to change other portions.
  1568. pascal ComponentResult MCSetControllerPort (MovieController mc,
  1569.                                                              CGrafPtr gp);
  1570. mc    Specifies the movie controller for the operation. You obtain this 
  1571. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1572. gp    Points to the new graphics port for the movie controller. Set this parameter to nil to use the current graphics port.
  1573. DESCRIPTION
  1574. The movie controller component may use the foreground and background colors 
  1575. from the graphics port at the time the MCSetController function is called to colorize the movie controller. 
  1576. Movie controller components use the MCSetControllerPort function each time 
  1577. you create a new movie controller. Hence, your component must be set to a valid port before creating a new movie controller. 
  1578. MCGetControllerPort
  1579.  
  1580. The MCGetControllerPort function returns a movie controller’s color graphics port. 
  1581. pascal CGrafPtr MCGetControllerPort (MovieController mc);
  1582. mc    Specifies the movie controller for the operation. You obtain this 
  1583. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1584. Handling Movie Events
  1585.  
  1586. Movie controller components provide functions that handle movie controller actions. Your application must call these functions whenever an event occurs. Consider this event loop:
  1587. #if whatIsHandleEvent
  1588.     while (! gDoneFlag) {
  1589.         gResult = GetNextEvent (everyEvent, &gEventRec);
  1590.         if (( MCIsPlayerEvent(gMCPlay, &gEventRec) == 0 )) {
  1591.             if (gResult) {
  1592.                 /* player didn't handle the event */
  1593.                 HandleEvent(gEventRec);
  1594.             }
  1595.         }
  1596.     }
  1597. #endif
  1598. #if 0
  1599. /* interface for application-defined routine: */
  1600. pascal Boolean MyPlayerFilter ( MovieController mc,  
  1601.                                             short* action, long* params);
  1602. #endif
  1603. If the movie controller component handles the event, your application can loop to wait for the next event. Otherwise, your application must take care of the event as part of its normal event handling.
  1604. Movie controller components support an action filter. You can instruct the filter to invoke a function in your application whenever actions occur. This action filter function can then perform specialized processing or refer the action back to the movie controller component. The actions supported by movie controller components are discussed in “Movie Controller Actions,” which begins on page 2-15. 
  1605. The MCIsPlayerEvent function lets you pass events to a movie controller component. The MCSetActionFilterWithRefCon function allows you to specify your action filter function for a movie controller.
  1606. You can use the MCDoAction function to request action processing from a movie controller.
  1607. If you use any Movie Toolbox functions to change the characteristics of a movie that is associated with a movie controller, you must inform the movie controller—use the MCMovieChanged function.
  1608. You can obtain information about the current state of the movie controller and its movie by calling the MCGetControllerInfo function.
  1609. MCIsPlayerEvent
  1610.  
  1611. The MCIsPlayerEvent function handles all events for a movie controller. Your application should call this function in its main event loop. Call MCIsPlayerEvent for each active movie controller until the event is handled. 
  1612. This function returns a long integer indicating whether the movie controller component handled the event. The component sets this long integer to 1 if it handled the event. Your application should then skip the rest of its event loop and wait for the next event. The return value is 0 otherwise. Your application must then handle the event as part of its normal event processing.
  1613. The movie controller component does everything necessary to support the movie controller and its associated movie. For example, the component calls the Movie Toolbox’s MoviesTask function for each movie. The movie controller component also handles suspend and resume events. It treats suspend events as deactivate requests and resume events as activate requests.
  1614. You can provide an action filter function that is called by the movie controller component. See “Application-Defined Function,” which begins on page 2-61, for details. The component calls your filter function after it decides to process a particular action, but before it actually does so. In this manner, your application can perform custom action processing for a movie controller. Set your action filter function with the MCSetActionFilterWithRefCon function, described on page 2-47.
  1615. pascal ComponentResult MCIsPlayerEvent (MovieController mc,
  1616.                                                      const EventRecord *e);
  1617. mc    Specifies the movie controller for the operation. You obtain this 
  1618. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1619. e    Points to the current event structure.
  1620. DESCRIPTION
  1621. The MCIsPlayerEvent function returns a long integer indicating whether it handled the event. If the movie controller component handled the event, this function sets the returned value to 1. Your application should then skip the rest of its event loop and wait for the next event. If the component did not handle the event, the MCIsPlayerEvent function returns a value of 0. Your application must then handle the event.
  1622. MCDoAction
  1623.  
  1624. Your application can use the MCDoAction function to invoke a movie controller component and have it perform a specified action.
  1625. pascal ComponentResult MCDoAction (MovieController mc, 
  1626.                                                 short action, void *params;
  1627. mc    Specifies the movie controller for the operation. You obtain this 
  1628. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function.
  1629. action    Specifies the action to be taken. See “Movie Controller Actions,” which begins on page 2-15, for descriptions of the actions supported by movie controller components.
  1630. params    Points to the parameter data appropriate to the action. See the individual action descriptions in “Movie Controller Actions,” which begins on page 2-15, for information about the parameters required for each supported action.
  1631. DESCRIPTION
  1632. For example, your application might define a menu item that stops all currently playing movies. When the user selects this menu item, your application could use the MCDoAction function to instruct each controller to stop playing. You would do so by specifying an mcActionPlay action with the parameters set to 0 to indicate that the controller should stop playing the movie.
  1633. MCSetActionFilterWithRefCon
  1634.  
  1635. The MCSetActionFilterWithRefCon function allows your application to establish an action filter function for a movie controller. The movie controller component calls your action filter function each time the component receives an action for its movie controller. Your filter function is then free to handle the action or to refer it back to the movie controller component. If you refer it back to the movie controller component, the component handles the action. See “Movie Controller Actions,” which begins on page 2-15, for a description of the actions supported by movie controller components.
  1636. pascal ComponentResult MCSetActionFilterWithRefCon
  1637.                                                 (MovieController mc,
  1638.                                                  MCActionFilter filter,
  1639.                                                  long refCon);
  1640. mc    Specifies the movie controller for the operation. You obtain this 
  1641. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1642. filter    Points to your action filter function. Set this parameter to nil to remove your action filter function.
  1643. refCon    Contains a reference constant value. The movie controller component passes this reference constant to your action filter function each time it calls your function.
  1644. DESCRIPTION
  1645. Movie controller components allow your application to field movie controller actions. You define an action filter function in your application and assign it to a controller by calling the MCSetActionFilterWithRefCon function. 
  1646. You can use the constants described in “Movie Controller Actions,” which begins on page 2-15, to refer to movie controller actions.
  1647. If your filter function handles an action, you can handle the action in any way you desire. For example, your filter function could change the operation of movie controller buttons. More commonly, applications use the action filter function to monitor actions of the controller. For instance, your filter function might enable you to find out when the user clicks the play button, so that your application can enable appropriate menu selections. Alternatively, you can use the filter function to detect when the user resizes the movie.
  1648. SEE ALSO
  1649. If you use any Movie Toolbox functions that modify the movie in your action filter function, be sure to call the MCMovieChanged function (described on page 2-49).
  1650. MCGetControllerInfo
  1651.  
  1652. Your application can use the MCGetControllerInfo function to determine the current status of a movie controller and its associated movie. You can use this information to control your application’s menu highlighting.
  1653. pascal ComponentResult MCGetControllerInfo (MovieController mc,
  1654.                                                              long *someFlags);
  1655. mc    Specifies the movie controller for the operation. You obtain this 
  1656. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1657. someFlags    Contains a pointer to flags that specify the current status and capabilities of the controller. The following flags are defined (more than one flag may be set to 1):
  1658. mcInfoUndoAvailable
  1659. The user has edited the movie. If this flag is set to 1, you can call the MCUndo function (described on page 2-54).
  1660. mcInfoCutAvailable
  1661. The user has selected some material in the movie and editing is enabled. If this flag is set to 1, you can call the MCCut function (described on page 2-52).
  1662. mcInfoCopyAvailable
  1663. The user has selected some material in the movie. If this flag is set to 1, you can call the MCCopy function (described on page 2-52).
  1664. mcInfoPasteAvailable
  1665. There is movie data in the scrap and editing is enabled. If this flag is set to 1, you can call the MCPaste function (described on page 2-53).
  1666.     If your application maintains a private scrap, this flag does not reflect the state of that scrap.
  1667. mcInfoClearAvailable
  1668. The user has selected some material in the movie and editing is enabled. If this flag is set to 1, you can call the MCClear function (described on page 2-54).
  1669. mcInfoHasSound
  1670. The movie has sound. If this flag is set to 1, the controller can play a movie’s sound.
  1671. mcInfoIsPlaying
  1672. If this flag is set to 1, the movie is playing.
  1673. mcInfoIsLooping 
  1674. The controller is currently set to play its movie repeatedly. If this flag is set to 1, the movie is looping.
  1675. mcInfoIsInPalindrome
  1676. The controller is currently set to play its movie 
  1677. repeatedly, alternating between forward and backward playback. If this flag is set to 1, the movie is in palindrome looping mode.
  1678. mcInfoEditingEnabled
  1679. The user can edit the movie associated with this controller. If this flag is set to 1, you have enabled editing by calling the MCEnableEditing function (described on page 2-50).
  1680. MCMovieChanged
  1681.  
  1682. The MCMovieChanged function lets you inform a movie controller component that your application has used the Movie Toolbox to change the characteristics of its associated movie. 
  1683. pascal ComponentResult MCMovieChanged (MovieController mc,
  1684.                                                     Movie theMovie);
  1685. mc    Specifies the movie controller for the operation. You obtain this 
  1686. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1687. theMovie    Identifies the movie that has been changed.
  1688. DESCRIPTION
  1689. Your application should be able to make most movie changes using the MCDoAction function (described on page 2-46). However, if your application uses Movie 
  1690. Toolbox functions to change the characteristics of a movie that is associated with a movie controller, you must inform the controller so that it can update itself accordingly. For instance, if your application changes the size of the movie without informing the movie controller component, the control portion of the controller may no longer be the proper size for the movie.
  1691. RESULT CODES
  1692. Memory Manager errors
  1693. Editing Movies
  1694.  
  1695. Movie controller components can provide editing capabilities. This section describes the functions that your application can use to alter movies that are associated with movie controllers. 
  1696. Your application can use the MCEnableEditing function to enable editing for a specified movie controller. Movie controller components may return an error code indicating that editing is not supported. Use the MCIsEditingEnabled function to find out if editing is enabled for a specified controller.
  1697. The MCCopy, MCCut, MCPaste, MCClear, and MCUndo functions support normal editing operations on movies associated with movie controllers. These functions operate on the current movie selection. 
  1698. Two functions are also provided that facilitate work with Edit menus. You can use the MCSetUpEditMenu function to highlight and name the items in the Edit menu for your application. The MCGetMenuString function is provided for you to use with a non-standard Edit menu. 
  1699. MCEnableEditing
  1700.  
  1701. The MCEnableEditing function allows your application to enable and disable editing for a movie controller. Once editing is enabled for a controller, the user may edit the movie associated with the controller.
  1702. pascal ComponentResult MCEnableEditing (MovieController mc,
  1703.                                                      Boolean enabled);
  1704. mc    Specifies the movie controller for the operation. You obtain this 
  1705. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1706. enabled    Specifies whether to enable or disable editing for the controller. Set this parameter to true to enable editing; set the enabled parameter to false to disable editing.
  1707. DESCRIPTION
  1708. By default, editing is turned off when you create a new movie controller. If you want to allow the user to edit, you must use the MCEnableEditing function to enable editing.
  1709. SPECIAL CONSIDERATIONS
  1710. Note that a movie controller component may not support editing. Therefore, your application should check the component result from this function before continuing with other movie-editing operations.
  1711. MCIsEditingEnabled
  1712.  
  1713. The MCIsEditingEnabled function allows your application to determine whether editing is currently enabled for a movie controller. The movie controller component returns a long value reflecting the edit state of the controller. Once editing is enabled for a controller, the user may edit the movie associated with the controller.
  1714. pascal long MCIsEditingEnabled (MovieController mc);
  1715. mc    Specifies the movie controller for the operation. You obtain this 
  1716. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1717. DESCRIPTION
  1718. The MCIsEditingEnabled function returns a long integer that contains a value indicating the current edit state of the controller. This returned value is set to 1 if editing is enabled. This returned value is set to 0 if editing is disabled or if the controller component does not support editing.
  1719. MCCut
  1720.  
  1721. The MCCut function returns a copy of the current movie selection from the movie associated with a specified controller and then removes the current movie selection from the source movie. Your application is responsible for the returned movie. If you want to allow the user to paste the movie selection, use the Movie Toolbox’s PutMovieOnScrap function to place the movie selection onto the scrap. Be sure to dispose of the movie afterward, using the Movie Toolbox’s DisposeMovie function.
  1722. pascal Movie MCCut (MovieController mc);
  1723. mc    Specifies the movie controller for the operation. You obtain this identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1724. DESCRIPTION
  1725. The MCCut function returns a movie containing the current selection from the movie associated with the specified controller. If the user has not made a selection, the returned movie reference is set to nil.
  1726. SEE ALSO
  1727. The MCCut function is analogous to the Movie Toolbox’s CutMovieSelection function.
  1728. MCCopy
  1729.  
  1730. The MCCopy function returns a copy of the current movie selection from the movie associated with a specified controller. The selection remains active after this operation. Your application is responsible for the returned movie. 
  1731. If you want to allow the user to paste the movie selection, use the Movie Toolbox’s PutMovieOnScrap function to place the movie selection onto the scrap. Be sure to dispose of the movie afterward, using the Movie Toolbox’s DisposeMovie function.
  1732. pascal Movie MCCopy (MovieController mc);
  1733. mc    Specifies the movie controller for the operation. You obtain this identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1734. DESCRIPTION
  1735. The MCCopy function returns a movie containing the current selection from the movie associated with the specified controller. If the user has not made a selection, the returned movie reference is set to nil.
  1736. SEE ALSO
  1737. This function is analogous to the Movie Toolbox’s CopyMovieSelection function.
  1738. MCPaste
  1739.  
  1740. The MCPaste function inserts a specified movie at the current movie time in the movie associated with a specified controller. 
  1741. pascal ComponentResult MCPaste (MovieController mc, 
  1742.                                             Movie srcMovie);
  1743. mc    Specifies the movie controller for the operation. You obtain this identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1744. srcMovie    Specifies the movie to be inserted into the current selection in the movie associated with the movie controller specified by the mc parameter. If you set this parameter to nil, the movie controller component retrieves the source movie from the scrap.
  1745. DESCRIPTION
  1746. All of the tracks from the source movie are placed in the destination movie. If the duration of the destination movie’s current selection is 0, the source movie is inserted at the starting time of the current selection. If the current selection duration is nonzero, the function clears the current selection and then inserts the tracks from the source movie. After the paste operation, the current selection time is set to the start of the tracks that were inserted and the duration is set to the source movie’s duration.
  1747. SEE ALSO
  1748. This function is analogous to the Movie Toolbox’s PasteMovieSelection function.
  1749. SPECIAL CONSIDERATIONS
  1750. The preferred way to use the MCPaste function is to set the srcMovie parameter to nil. This causes the movie controller to use movie import components to paste other types of data than movies.
  1751. MCClear
  1752.  
  1753. The MCClear function removes the current movie selection from the movie associated with a specified controller.
  1754. pascal ComponentResult MCClear (MovieController mc);
  1755. mc    Specifies the movie controller for the operation. You obtain this identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function.
  1756. DESCRIPTION
  1757. After removing the segment, the duration of the movie’s current selection is set to 0. This function removes empty tracks from the resulting movie.
  1758. SEE ALSO
  1759. This function is analogous to the Movie Toolbox’s ClearMovieSelection function.
  1760. MCUndo
  1761.  
  1762. The MCUndo function allows your application to discard the effects of the most recent edit operation. 
  1763. pascal ComponentResult MCUndo (MovieController mc);
  1764. mc    Specifies the movie controller for the operation. You obtain this identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1765. SEE ALSO
  1766. Your movie controller component could use the Movie Toolbox’s edit state functions to implement this function. (See the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for more information about the edit state functions.)
  1767. MCSetUpEditMenu
  1768.  
  1769. The MCSetUpEditMenu function correctly highlights and names the items in your application’s Edit menu. 
  1770. pascal ComponentResult MCSetUpEditMenu (MovieController mc, 
  1771.                                                     long modifiers, 
  1772.                                                     MenuHandle mh);
  1773. mc    Specifies the movie controller for this operation. You obtain this identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function. 
  1774. modifiers    Indicates the current modifiers from the mouse-down or key-down event to which you are responding.
  1775. mh    Specifies a menu handler to your current Edit menu. The first six items in your Edit menu should be the standard editing commands: Undo, a blank line, Cut, Copy, Paste, and Clear.
  1776. DESCRIPTION
  1777. When your application is highlighting its menus, you should call MCSetUpEditMenu immediately before you use the Menu Manager’s MenuSelect or MenuKey functions. For details on MenuSelect and MenuKey, see Inside Macintosh: Macintosh Toolbox Essentials.
  1778. MCGetMenuString
  1779.  
  1780. If your application has a non-standard Edit menu, you can use the MCGetMenuString function together with the MCGetControllerInfo function to assign names correctly to the items in your application’s Edit menu. 
  1781. pascal ComponentResult MCGetMenuString (MovieController mc, 
  1782.                                                     long modifiers, 
  1783.                                                     short item, 
  1784.                                                     Str255 aString);
  1785. mc    Specifies the movie controller for this operation. You obtain this identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function. 
  1786. modifiers    Indicates the current modifiers from the mouse-down or key-down event to which you are responding.
  1787. item    Contains one of the appropriate movie controller Edit menu constants returned in the aString parameter.
  1788. aString    Contains (on return) an appropriate string to set the menu item text. The following flags are available:
  1789. mcMenuUndo
  1790. Contains the string to set the menu item text to the Undo command.
  1791. mcMenuCut    Contains the string to set the menu item text to the Cut command.
  1792. mcMenuCopy
  1793. Contains the string to set the menu item text to the Copy command.
  1794. mcMenuPaste
  1795. Contains the string to set the menu item text to the Paste command.
  1796. mcMenuClear
  1797. Contains the string to set the menu item text to the Clear command.
  1798. DESCRIPTION
  1799. The MCGetMenuString function is used by the MCSetUpEditMenu function, which is described in the previous section. 
  1800. SEE ALSO
  1801. To highlight menu items, use the MCGetControllerInfo function, which is described on page 2-48, to determine which items should be enabled.
  1802. Getting and Setting Movie Controller Time
  1803.  
  1804. Movie controller components provide functions that allow your application to work with temporal aspects of movie controllers. You can use the MCSetDuration function to set the duration of a movie controller to some arbitrary value. The MCGetCurrentTime function lets you retrieve the time value represented by the indicator on the movie controller’s slider.
  1805. MCSetDuration
  1806.  
  1807. The MCSetDuration function allows your application to set a controller’s duration in the case where a controller does not have a movie associated with it. 
  1808. pascal ComponentResult MCSetDuration (MovieController mc,
  1809.                                                      TimeValue duration);
  1810. mc    Specifies the movie controller for the operation. You obtain this 
  1811. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1812. duration    Specifies the new duration for the movie. This duration value must be in the controller’s time scale.
  1813. DESCRIPTION
  1814. The controller’s duration remains at this new value until you assign a movie to the controller.
  1815. SEE ALSO
  1816. You can use the MCGetCurrentTime function, which is described in the next section, to obtain the time scale for the controller.
  1817. MCGetCurrentTime
  1818.  
  1819. Your application can use the MCGetCurrentTime function to obtain the time value represented by the indicator on the movie controller’s slider. This time value is appropriate to the movie currently being affected by the movie controller. You can also obtain the time scale for this time value.
  1820. pascal TimeValue MCGetCurrentTime (MovieController mc, 
  1821.                                                  TimeScale *scale);
  1822. mc    Specifies the movie controller for the operation. You obtain this 
  1823. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1824. scale    Contains a pointer to a field that is to receive the time scale for the controller.
  1825. DESCRIPTION
  1826. The MCGetCurrentTime function returns the time value that corresponds to the current setting of the indicator on the movie controller’s slider. 
  1827. Customizing Event Processing
  1828.  
  1829. Movie controller components provide a number of functions that allow your application to customize event processing. If your application does not use the MCIsPlayerEvent function (described on page 2-45), you can use these functions to direct movie controller events to the appropriate movie controller component. The component then attempts to handle the event.
  1830. Your application obtains the values for many of the function parameters from the appropriate event structure.
  1831. Each function returns a value that indicates whether it handled the event. If the controller component completely handles the event, the function sets the return value 
  1832. to 1. If the controller component does not handle the event, the function sets the return value to 0. Your application must then handle the event.
  1833. MCActivate
  1834.  
  1835. Your application can use the MCActivate function in response to activate, deactivate, suspend, and resume events.
  1836. pascal ComponentResult MCActivate (MovieController mc, 
  1837.                                                  WindowPtr w, 
  1838.                                                  Boolean activate);
  1839. mc    Specifies the movie controller for the operation. You obtain this 
  1840. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1841. w    Specifies the window in which the event has occurred.
  1842. activate    Indicates the nature of the event. Set this parameter to true for activate and resume events. Set it to false for deactivate and suspend events.
  1843. DESCRIPTION
  1844. The MCActivate function returns a value indicating whether it handled the event. The function sets the returned value to 1 if it handles the event. The function sets the returned value to 0 if it does not handle the event. In this case, your application is responsible for the event.
  1845. MCClick
  1846.  
  1847. Your application should call the MCClick function when the user clicks in a movie controller window.
  1848. pascal ComponentResult MCClick (MovieController mc, WindowPtr w,
  1849.                                              Point where, long when, 
  1850.                                             long modifiers);
  1851. mc    Specifies the movie controller for the operation. You obtain this identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1852. w    Specifies the window in which the event has occurred.
  1853. where    Indicates the location of the click. This value is expressed in the local coordinates of the window specified by the w parameter. Your application must convert this value from the global coordinates returned in the event structure.
  1854. when    Indicates when the user pressed the mouse button. You obtain this value from the event structure.
  1855. modifiers    Specifies modifier flags for the event. You obtain this value from the event structure.
  1856. DESCRIPTION
  1857. The MCClick function returns a value indicating whether it handled the event. The function sets the returned value to 1 if it handles the event. The function sets the returned value to 0 if it does not handle the event. In this case, your application is responsible for the event.
  1858. MCDraw
  1859.  
  1860. Your application should call the MCDraw function in response to an update event. The movie controller component updates the movie controller if the controller is in the window that received the update event. The controller component updates the movie associated with the controller only if the movie is contained in the window that received the event.
  1861. pascal ComponentResult MCDraw (MovieController mc, WindowPtr w);
  1862. mc    Specifies the movie controller for the operation. You obtain this 
  1863. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1864. w    Points to the window in which the update event has occurred.
  1865. DESCRIPTION
  1866. The MCDraw function returns a value indicating whether it handled the event. The function sets the returned value to 1 if it handles the event. The function sets the returned value to 0 if it does not handle the event. In this case, your application is responsible for the event.
  1867. MCIdle
  1868.  
  1869. The MCIdle function performs idle processing for a movie controller. This idle processing includes calling the Movie Toolbox’s MoviesTask function for each movie that is associated with the controller. Your application should call the MCIdle function as often as possible, in order to ensure consistent movie play behavior.
  1870. pascal ComponentResult MCIdle (MovieController mc);
  1871. mc    Specifies the movie controller for the operation. You obtain this 
  1872. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1873. DESCRIPTION
  1874. The MCIdle function returns a value indicating whether it handled the event. The function sets the returned value to 1 if it handles the event. The function sets the returned value to 0 if it does not handle the event. In this case, your application is responsible for the event.
  1875. MCKey
  1876.  
  1877. The MCKey function handles keyboard events for a movie controller. You can call this function only if you have enabled keystroke processing in the controller. By default, keystroke processing is turned off when you create a movie controller. You can enable and disable keystroke processing using the mcActionSetKeysEnabled action with the MCDoAction function (described on page 2-46).
  1878. pascal ComponentResult MCKey (MovieController mc, char key,
  1879.                                         long modifiers);
  1880. mc    Specifies the movie controller for the operation. You obtain this 
  1881. identifier from the Component Manager’s OpenComponent or OpenDefaultComponent function, or from the NewMovieController function (described on page 2-29).
  1882. key    Specifies the keystroke. You obtain this value from the event structure.
  1883. modifiers    Specifies modifier flags for the event. You obtain this value from the event structure.
  1884. DESCRIPTION
  1885. The MCKey function returns a value indicating whether it handled the event. The function sets the returned value to 1 if it handles the event. The function sets the returned value to 0 if it does not handle the event. In this case, your application is responsible for the event.
  1886. Application-Defined Function
  1887.  
  1888. Movie controller components provide an action filter function that you establish with the MCSetActionFilterWithRefCon function (described on page 2-47).
  1889. MyPlayerFilterWithRefCon
  1890.  
  1891. Your action filter function, MyPlayerFilterWithRefCon, should be in this form:
  1892. Boolean MyPlayerFilterWithRefCon (MovieController mc, 
  1893.                                              short action, 
  1894.                                              void *params, long refCon);
  1895. mc    Specifies the movie controller for the operation. 
  1896. action    A short integer containing the action code. The movie controller component sets this parameter to point to the what field in the appropriate action structure. (Although this action is passed as a variable, it should not be changed by the filter.) See “Movie Controller Actions,” which begins on page 2-15, for a description of the actions supported by movie controller components.
  1897. params    Contains a pointer to the parameter data appropriate to the action—for example, setting the playback rate. See the individual descriptions of the actions beginning on page 2-15 for information about the parameters supplied for each supported action.
  1898. refCon    Contains a reference constant value. The movie controller component passes this reference constant to your action filter function each time it calls your function.
  1899. DESCRIPTION
  1900. Your filter function must return a Boolean value indicating whether it handled 
  1901. the action. Set the returned Boolean value to true if your function completely 
  1902. handles the action. In this case, the movie controller component performs no additional processing for the action. Set the returned value to false if your function does not handle the action. The movie controller component then performs the appropriate processing for the action.
  1903.  
  1904.  
  1905. Summary of Movie Controller Components
  1906.  
  1907. C Summary
  1908.  
  1909. Constants
  1910.  
  1911. enum {
  1912.     kMCSetMovieSelect                                         = 2,        /* MCSetMovie */
  1913.     kMCRemoveMovieSelect                                         = 3,        /* MCRemoveMovie */
  1914.     kMCIsPlayerEventSelect                                         = 7,        /* MCIsPlayerEvent */
  1915.     kMCSetActionFilterSelect                                         = 8,        /* MCSetActionFilter */
  1916.     kMCDoActionSelect                                         = 9,        /* MCDoAction */
  1917.     kMCSetControllerAttachedSelect= 10,         /* MCSetControllerAttached */
  1918.     kMCIsControllerAttachedSelect                                         = 11,        /* MCIsControllerAttached */
  1919.     kMCSetControllerPortSelect                                         = 12,        /* MCSetControllerPort */
  1920.     kMCGetControllerPortSelect                                         = 13,        /* MCGetControllerPort */
  1921.     kMCGetVisibleSelect                                         = 14,        /* MCGetVisible */
  1922.     kMCSetVisibleSelect                                        = 15,        /* MCSetVisible */
  1923.     kMCGetControllerBoundsRectSelect    
  1924.                                             = 16,        /* MCGetControllerBoundsRect */
  1925.     kMCSetControllerBoundsRectSelect    
  1926.                                             = 17,        /* MCSetControllerBoundsRect */
  1927.     kMCGetControllerBoundsRgnSelect                                         
  1928.                                             = 18,        /* MCGetControllerBoundsRgn */
  1929.     kMCGetWindowRgnSelect                                         = 19,        /* MCGetWindowRgn */
  1930.     kMCMovieChangedSelect                                         = 20,        /* MCMovieChanged */
  1931.     kMCSetDurationSelect                                         = 21,        /* MCSetDuration */
  1932.     kMCGetCurrentTimeSelect                                         = 22,        /* MCGetCurrentTime */
  1933.     kMCNewAttachedControllerSelect    = 23,                                            /* MCNewAttachedController */
  1934.     kMCDrawSelect                                         = 24,        /* MCDraw */
  1935.     kMCActivateSelect                                         = 25,        /* MCActivate */
  1936.     kMCIdleSelect                                         = 26,        /* MCIdle */
  1937.     kMCKeySelect                                         = 27,        /* MCKey */
  1938.     kMCClickSelect                                         = 28,        /* MCClick */
  1939.     kMCEnableEditingSelect                                         = 29,        /* MCEnableEditing */
  1940.     kMCIsEditingEnabledSelect                                         = 30,        /* MCIsEditingEnabled*/
  1941.     kMCCopySelect                                         = 31,        /* MCCopy */
  1942.     kMCCutSelect                                         = 32,        /* MCCut */
  1943.     kMCPasteSelect                                             = 33,        /* MCPaste */ 
  1944.     kMCClearSelect                                             = 34,        /* MCClear */
  1945.     kMCUndoSelect                                             = 35,        /* MCUndo */
  1946.     kMCPositionControllerSelect                                             = 36,        /* MCPositionController */
  1947.     kMCGetControllerInfoSelect                                             = 37,        /* MCGetControllerInfo */
  1948.     kMCSetClipSelect                                             = 40,        /* MCSetClip */
  1949.     kMCGetClipSelect                                             = 41,        /* MCGetClip */
  1950.     kMCDrawBadgeSelect                                             = 42,        /* MCDrawBadge */
  1951.     kMCSetUpEditMenuSelect                                             = 43,        /* MCSetUpEditMenu */
  1952.     kMCGetMenuStringSelect                                             = 44,        /* MCGetMenuString */
  1953.     kMCSetActionFilterWithRefConSelect                                     
  1954.                                                 = 45        
  1955.                                                     /* SetActionFilterWithRefConSelect */
  1956. };
  1957. enum {
  1958.     mcActionIdle                                         = 1,        /* give event-processing time to 
  1959.                                                         movie controller */
  1960.     mcActionDraw                                         = 2,        /* send update event to movie
  1961.                                                         controller */
  1962.     mcActionActivate                                         = 3,        /* activate movie controller */
  1963.     mcActionDeactivate                                         = 4,        /* deactivate controller */
  1964.     mcActionMouseDown                                         = 5,        /* pass mouse-down event */
  1965.     mcActionKey                                         = 6,        /* pass key-down or auto-key event */
  1966.     mcActionPlay                                         = 8,        /* start playing movie */
  1967.     mcActionGoToTime                                         = 12,        /* move to specific time in a movie */
  1968.     mcActionSetVolume                                         = 14,        /* set a movie's volume */
  1969.     mcActionGetVolume                                         = 15,        /* retrieve a movie's volume */
  1970.     mcActionStep                                         = 18,        /* play a movie a specified number
  1971.                                                         of frames at a time */
  1972.     mcActionSetLooping                                         = 21,        /* enable or disable looping */
  1973.     mcActionGetLooping                                         = 22,        /* find out if movie is looping  */
  1974.     mcActionSetLoopIsPalindrome                                         = 23,        /* enable palindrome looping */
  1975.     mcActionGetLoopIsPalindrome                                         = 24,        /* find out if palindrome looping
  1976.                                                         is on */
  1977.     mcActionSetGrowBoxBounds                                         = 25,        /* set limits for resizing a movie */
  1978.     mcActionControllerSizeChanged     = 26,                                            /* user has resized movie 
  1979.                                                         controller */
  1980.     mcActionSetSelectionBegin                                         = 29,        /* start time of movie's current
  1981.                                                         selection */
  1982.     mcActionSetSelectionDuration                                         = 30,        /* set duration of movie's current
  1983.                                                          selection     */
  1984.     mcActionSetKeysEnabled                                         = 32,        /* enable or disable keystrokes for
  1985.                                                         movie */
  1986.     mcActionGetKeysEnabled                                         = 33,        /* find out if keystrokes are 
  1987.                                                         enabled */
  1988.     mcActionSetPlaySelection                                         = 34,        /* constrain playing to the current
  1989.                                                         selection     */
  1990.     mcActionGetPlaySelection                                         = 35,        /* find out if movie is constrained to
  1991.                                                         playing within selection */
  1992.     mcActionSetUseBadge                                         = 36,        /* enable or disable movie's
  1993.                                                         playback badge */
  1994.     mcActionGetUseBadge                                         = 37,        /* find out if movie controller is
  1995.                                                         using playback badge */
  1996.     mcActionSetFlags                                         = 38,        /* set movie's control flags */
  1997.     mcActionGetFlags                                         = 39,        /* retrieve movie's control flags */
  1998.     mcActionSetPlayEveryFrame                                         = 40,        /* instruct controller to play all
  1999.                                                         frames in movie */
  2000.     mcActionGetPlayEveryFrame                                         = 41,        /* find out if controller is playing
  2001.                                                         every frame in movie */
  2002.     mcActionGetPlayRate                                         = 42,        /* determine playback rate */
  2003.     mcActionShowBalloon                                         = 43,        /* find out if controller wants to
  2004.                                                         display Balloon Help */
  2005.     mcActionBadgeClick                                         = 44,        /* user clicked movie's badge */
  2006.     mcActionMovieClick                                         = 45,        /* user clicked movie */    
  2007.     mcActionSuspend                                         = 46,        /* suspend action */
  2008.     mcActionResume                                         = 47        /* resume action */
  2009. };
  2010.  
  2011. enum {
  2012.     mcTopLeftMovie                             = 1<<0,                /* places movie in upper-left corner of
  2013.                                                     display rectangle */
  2014.     mcScaleMovieToFit         ‘                    = 1<<1,                /* resizes movie to fit into display
  2015.                                                     rectangle */
  2016.     mcWithBadge                             = 1<<2,                /* controls whether badge is displayed */
  2017.     mcNotVisible                             = 1<<3,                /* controls whether controller portion 
  2018.                                                     is visible */
  2019.     mcWithFrame                             = 1<<4                /* specifies whether component shows
  2020.                                                     frame around movie */
  2021. };
  2022.  
  2023. enum {
  2024.     mcFlagSuppressMovieFrame                                         = 1<<0,            /* controls display of frame */
  2025.     mcFlagSuppressStepButtons                                         = 1<<1,            /* controls display of step 
  2026.                                                             buttons */
  2027.     mcFlagSuppressSpeakerButton                                         = 1<<2,            /* controls display of speaker
  2028.                                                             button */
  2029.     mcFlagsUseWindowPalette                                         = 1<<3            /* controls display of window
  2030.                                                              palette */
  2031. };
  2032. enum {
  2033.     mcInfoUndoAvailable                                     = 1<<0,            /* MCUndo function available */
  2034.     mcInfoCutAvailable                                     = 1<<1,            /* MCCut function available */
  2035.     mcInfoCopyAvailable                                     = 1<<2,            /* MCCopy function available */
  2036.     mcInfoPasteAvailable                                     = 1<<3,            /* MCPaste function available */
  2037.     mcInfoClearAvailable                                     = 1<<4,            /* MCClear function available */
  2038.     mcInfoHasSound                                     = 1<<5,            /* controller can play movie's 
  2039.                                                         sound */
  2040.     mcInfoIsPlaying                                     = 1<<6,            /* movie is playing */
  2041.     mcInfoIsLooping                                     = 1<<7,            /* movie is looping */
  2042.     mcInfoIsInPalindrome                                     = 1<<8,            /* movie is alternating between 
  2043.                                                         forward and backward playback */
  2044.     mcInfoEditingEnabled                                     = 1<<9            /* MCEnableEditing function
  2045.                                                         available */
  2046. };
  2047.  
  2048. enum {
  2049.     mcMenuUndo                = 1,        /* Undo command */
  2050.     mcMenuCut                = 3,        /* Cut command */
  2051.     mcMenuCopy                = 4,        /* Copy command */
  2052.     mcMenuPaste                = 5,        /* Paste command */
  2053.     mcMenuClear = 6                        /* Clear command */
  2054. };
  2055.  
  2056. enum {
  2057.     mcPositionDontInvalidate = 1<<5                                            /* do not invalidate areas of window
  2058.                                                     changed due to repositioning of movie
  2059.                                                     or controller */
  2060. };
  2061. Data Types
  2062.  
  2063. typedef short mcAction;
  2064. typedef unsigned long MCFlags;
  2065. Movie Controller Functions
  2066.  
  2067. Associating Movies With Controllers
  2068. pascal MovieController NewMovieController
  2069. (Movie theMovie, const Rect *movieRect,
  2070. long someFlags);
  2071. pascal ComponentResult MCNewAttachedController
  2072. (MovieController mc, Movie theMovie, 
  2073. WindowPtr w, Point where);
  2074. pascal ComponentResult MCSetMovie
  2075. (MovieController mc, Movie theMovie,
  2076. WindowPtr movieWindow, Point where);
  2077. pascal Movie MCGetMovie    (MovieController mc);
  2078. pascal void DisposeMovieController
  2079. (MovieController mc);
  2080. Managing Controller Attributes
  2081. pascal ComponentResult MCPositionController
  2082. (MovieController mc, const Rect *movieRect, const Rect *controllerRect, long someFlags);
  2083. pascal ComponentResult MCSetControllerAttached
  2084. (MovieController mc, Boolean attach); 
  2085. pascal ComponentResult MCIsControllerAttached
  2086. (MovieController mc);
  2087. pascal ComponentResult MCSetVisible
  2088. (MovieController mc, Boolean visible);
  2089. pascal ComponentResult MCGetVisible
  2090. (MovieController mc);
  2091. pascal ComponentResult MCDrawBadge
  2092. (MovieController mc, RgnHandle movieRgn, RgnHandle *badgeRgn);
  2093. pascal ComponentResult MCSetControllerBoundsRect
  2094. (MovieController mc, const Rect *bounds); 
  2095. pascal ComponentResult MCGetControllerBoundsRect
  2096. (MovieController mc, Rect *bounds);
  2097. pascal RgnHandle MCGetControllerBoundsRgn
  2098. (MovieController mc);
  2099. pascal RgnHandle MCGetWindowRgn
  2100. (MovieController mc, WindowPtr w);
  2101. pascal ComponentResult MCSetClip
  2102. (MovieController mc, RgnHandle theClip, RgnHandle movieClip);
  2103. pascal ComponentResult MCGetClip
  2104. (MovieController mc, RgnHandle *theClip, RgnHandle *movieClip);
  2105. pascal ComponentResult MCSetControllerPort
  2106. (MovieController mc, CGrafPtr gp);
  2107. pascal CGrafPtr MCGetControllerPort
  2108. (MovieController mc);
  2109. Handling Movie Events
  2110. pascal ComponentResult MCIsPlayerEvent
  2111. (MovieController mc, const EventRecord *e);
  2112. pascal ComponentResult MCDoAction
  2113. (MovieController mc, short action, 
  2114. void *params);
  2115. pascal ComponentResult MCSetActionFilterWithRefCon
  2116. (MovieController mc, MCActionFilter filter, long refCon);
  2117. pascal ComponentResult MCGetControllerInfo
  2118. (MovieController mc, long *someFlags);
  2119. pascal ComponentResult MCMovieChanged
  2120. (MovieController mc, Movie theMovie);
  2121. Editing Movies
  2122. pascal ComponentResult MCEnableEditing
  2123. (MovieController mc, Boolean enabled);
  2124. pascal long MCIsEditingEnabled
  2125. (MovieController mc);
  2126. pascal Movie MCCut    (MovieController mc);
  2127. pascal Movie MCCopy    (MovieController mc);
  2128. pascal ComponentResult MCPaste
  2129. (MovieController mc, Movie srcMovie);
  2130. pascal ComponentResult MCClear
  2131. (MovieController mc);
  2132. pascal ComponentResult MCUndo
  2133. (MovieController mc);
  2134. pascal ComponentResult MCSetUpEditMenu 
  2135. (MovieController mc, long modifiers, 
  2136. MenuHandle mh);
  2137. pascal ComponentResult MCGetMenuString 
  2138. (MovieController mc,                                                     long modifiers,                                                     short item, 
  2139.                                                     Str255 aString);
  2140. Getting and Setting Movie Controller Time
  2141. pascal ComponentResult MCSetDuration
  2142. (MovieController mc, TimeValue duration);
  2143. pascal TimeValue MCGetCurrentTime
  2144. (MovieController mc, TimeScale *scale);
  2145. Customizing Event Processing
  2146. pascal ComponentResult MCActivate
  2147. (MovieController mc, WindowPtr w, 
  2148. Boolean activate);
  2149. pascal ComponentResult MCClick    
  2150. (MovieController mc, WindowPtr w, Point where, long when, long modifiers);
  2151. pascal ComponentResult MCDraw
  2152. (MovieController mc, WindowPtr w);
  2153. pascal ComponentResult MCIdle
  2154. (MovieController mc);
  2155. pascal ComponentResult MCKey    
  2156. (MovieController mc, char key, long modifiers);
  2157. Application-Defined Function
  2158.  
  2159. Boolean MyPlayerFilterWithRefCon
  2160. (MovieController mc, short *action, 
  2161.                                                             void *params, long refCon);
  2162. Pascal Summary
  2163.  
  2164. Constants
  2165.  
  2166. CONST        
  2167.     MovieControllerComponentType = 'play';
  2168.  
  2169.     {movie controller selectors}
  2170.     kMCSetMovieSelect                                             = 2;        {MCSetMovie}
  2171.     kMCGetMovie                                            = 5;        {MCGetMovie}
  2172.     kMCIsPlayerEventSelect                                            = 7;        {MCIsPlayerEvent}
  2173.     kMCSetActionFilterSelect                                             = 8;        {MCSetActionFilter}
  2174.     kMCDoActionSelect                                             = 9;        {MCDoAction}
  2175.     kMCSetControllerAttachedSelect                                             = $A;        {MCSetControllerAttached}
  2176.     kMCIsControllerAttachedSelect                                            = $B;        {MCIsControllerAttached}
  2177.     kMCSetControllerPortSelect                                             = $C;        {MCSetControllerPort}
  2178.     kMCGetControllerPortSelect                                             = $D;        {MCGetControllerPort}
  2179.     kMCGetVisibleSelect                                             = $E;        {MCGetVisible}
  2180.     kMCSetVisibleSelect                                             = $F;        {MCSetVisible}
  2181.     kMCGetControllerBoundsRectSelect                                             = $10;        {MCGetControllerBoundsRect}
  2182.     kMCSetControllerBoundsRectSelect                                             = $11;        {MCSetControllerBoundsRect        }
  2183.     kMCGetControllerBoundsRgnSelect                                             = $12;        {MCGetControllerBoundsRgn}
  2184.     kMCGetWindowRgnSelect                                             = $13;        {MCGetWindowRgn}
  2185.     kMCMovieChangedSelect                                             = $14;        {MCMovieChanged}
  2186.     kMCSetDurationSelect                                             = $15;        {MCSetDuration}
  2187.     kMCGetCurrentTimeSelect                                             = $16;        {MCGetCurrentTime}
  2188.     kMCNewAttachedControllerSelect                                             = $17;        {MCNewAttachedController}
  2189.     kMCDrawSelect                                             = $18;        {MCDraw}
  2190.     kMCActivateSelect                                             = $19;        {MCActivate}
  2191.     kMCIdleSelect                                             = $1A;        {MCIdle}
  2192.     kMCKeySelect                                             = $1B;        {MCKey}
  2193.     kMCClickSelect                                             = $1C;        {MCClick}
  2194.     kMCEnableEditingSelect                                             = $1D;    {MCEnableEditing}
  2195.     kMCIsEditingEnabledSelect                                             = $1E;        {MCIsEditingEnabled}
  2196.     kMCCopySelect                                             = $1F;        {MCCopy}
  2197.     kMCCutSelect                                             = $20;        {MCCut}
  2198.     kMCPasteSelect                                             = $21;        {MCPaste}
  2199.     kMCClearSelect                                             = $22;        {MCClear}
  2200.     kMCUndoSelect                                             = $23;        {MCUndo}
  2201.     kMCPositionControllerSelect                                             = $24;        {MCPositionController}
  2202.     kMCGetControllerInfoSelect                                             = $25;        {MCGetControllerInfo}
  2203.     kMCSetClipSelect                                             = $28;        {MCSetClip}
  2204.     kMCGetClipSelect                                             = $29;        {MCGetClip}
  2205.     kMCDrawBadgeSelect                                             = $2A;        {MCDrawBadge}
  2206.     kMCSetUpEditMenuSelect                                             = $2B;        {MCSetUpEditMenu}
  2207.     kMCGetMenuStringSelect                                             = $2C;        {MCGetMenuString}
  2208.     kMCSetActionFilterWithRefConSelect
  2209.                                                 = $2D;        {MCSetActionFilterWithRefConSelect}
  2210.     {movie controller actions}
  2211.     mcActionIdle                                             = 1;        {give event-processing }
  2212.                                                         { time to movie controller}
  2213.     mcActionDraw                                            = 2;        {send update event to movie }
  2214.                                                         { controller}
  2215.     mcActionActivate                                            = 3;        {activate controller}
  2216.     mcActionDeactivate                                            = 4;        {deactivate controller}
  2217.     mcActionMouseDown                                            = 5;        {pass mouse-down event}
  2218.     mcActionKey                                            = 6;        {pass key-down or auto-key event}
  2219.     mcActionPlay                                            = 8;        {start playing movie}
  2220.     mcActionGoToTime                                            = 12;        {move to specific time in }
  2221.                                                         { a movie}
  2222.     mcActionSetVolume                                            = 14;        {set a movie's volume}
  2223.     mcActionGetVolume                                            = 15;        {retrieve a movie's volume}
  2224.     mcActionStep                                            = 18;        {play movie skipping specified }
  2225.                                                         { number of frames at a time}
  2226.     mcActionSetLooping                                            = 21;        {enable/disable looping }
  2227.                                                         { for a movie}
  2228.     mcActionGetLooping                                            = 22;        {determine whether a }
  2229.                                                         { movie is looping}
  2230.     mcActionSetLoopIsPalindrome                                            = 23;        {enable palindrome looping}
  2231.     mcActionGetLoopIsPalindrome                                            = 24;        {is palindrome looping on?}
  2232.     mcActionSetGrowBoxBounds                                            = 25;        {set limits for resizing a movie}
  2233.     mcActionControllerSizeChanged                                            = 26;        {user has resized movie controller}
  2234.     mcActionSetSelectionBegin                                            = 29;        {start time of movie's }
  2235.                                                         { current selection}
  2236.     mcActionSetSelectionDuration                                            = 30;        {set duration of movie's }
  2237.                                                         { current selection}
  2238.     mcActionSetKeysEnabled                                            = 32;        {enable/disable }
  2239.                                                         { keystrokes for movie}
  2240.     mcActionGetKeysEnabled                                            = 33;        {are keystrokes enabled?}
  2241.     mcActionSetPlaySelection                                            = 34;        {constrain playing to the }
  2242.                                                         { current selection}
  2243.     mcActionGetPlaySelection                                            = 35;        {is movie constrained to }
  2244.                                                         { playing within selection}
  2245.     mcActionSetUseBadge                                            = 36;        {enable/disable movie's }
  2246.                                                         { playback badge}
  2247.     mcActionGetUseBadge                                            = 37;        {is movie controller }
  2248.                                                         { using playback badge?}
  2249.     mcActionSetFlags                                            = 38;        {set movie's control flags}
  2250.     mcActionGetFlags                                            = 39;        {get movie's control flags}
  2251.     mcActionSetPlayEveryFrame                                            = 40;        {instruct controller to }
  2252.                                                         { play all frames in movie}
  2253.     mcActionGetPlayEveryFrame                                            = 41;        {is controller playing }
  2254.                                                         { every frame in movie?}
  2255.     mcActionGetPlayRate                                            = 42;        {determine playback rate}
  2256.     mcActionShowBalloon                                            = 43;        {controller wants to }
  2257.                                                         { display balloon help}
  2258.     mcActionBadgeClick                                            = 44;        {user clicked movie's badge}
  2259.     mcActionMovieClick                                             = 45; {user clicked movie}
  2260.     mcActionSuspend                                             = 46; {suspend action}
  2261.     mcActionResume                                             = 47; {resume action}
  2262.     {controller creation flags}
  2263.     mcTopLeftMovie                                            = $1;        {places movie in upper-left }
  2264.                                                         { corner of display rectangle} 
  2265.     mcScaleMovieToFit                                            = $2;        {resizes movie to fit into }
  2266.                                                         { display rectangle}
  2267.     mcWithBadge                                             = $4; {controls whether badge }
  2268.                                                         { is displayed}
  2269.     mcNotVisible                                             = $8; {    controls whether controller }
  2270.                                                         { portion is visible}
  2271.     mcWithFrame                                             = $10;        {specifies whether component }
  2272.                                                         { shows frame around movie}
  2273.  
  2274.     {movie control flags}
  2275.     mcFlagSuppressMovieFrame                                            = $1;        {controls display of frame}
  2276.     mcFlagSuppressStepButtons                                            = $2;        {controls display of step buttons}
  2277.     mcFlagSuppressSpeakerButton                                            = $4;        {controls display of speaker }
  2278.                                                         { button}
  2279.     mcFlagsUseWindowPalette                                             = $5;        {controls display of window }
  2280.                                                         { palette}
  2281.     
  2282.     (movie controller information flags}
  2283.     mcInfoUndoAvailable                                            = $1;            {MCUndo function available}
  2284.     mcInfoCutAvailable                                            = $2;            {MCCut function available}
  2285.     mcInfoCopyAvailable                                            = $4;            {MCCopy function available}
  2286.     mcInfoPasteAvailable                                            = $8;            {MCPaste function available}
  2287.     mcInfoClearAvailable                                            = $10;            {MCClear function available}
  2288.     mcInfoHasSound                                            = $20;            {controller can play movie's }
  2289.                                                             { sound}
  2290.     mcInfoIsPlaying                                            = $40;            {movie is playing}
  2291.     mcInfoIsLooping                                            = $80;            {movie is looping}
  2292.     mcInfoIsInPalindrome                                            = $100;            {movie is alternating between }
  2293.                                                             { forward and backward playback}
  2294.     mcInfoEditingEnabled                                            = $200;            {MCEnableEditing function }
  2295.                                                             { available}
  2296.  
  2297.     mcMenuUndo                 = 1;        {Undo command}
  2298.     mcMenuCut                 = 3;        {Cut command}
  2299.     mcMenuCopy                = 4;        {Copy command}
  2300.     mcMenuPaste                = 5;        {Paste command}
  2301.     mcMenuClear                = 6;        {Clear commmand}
  2302.  
  2303.     mcPositionDontInvalidate = 32;                                            {do not invalidate areas of window }
  2304.                                                 { changed due to repositioning of }
  2305.                                                 { movie or controller}
  2306. Data Types
  2307.  
  2308. TYPE
  2309.     mcAction                                             = Integer;
  2310.     mcFlags                                             = LongInt;
  2311. Movie Controller Routines
  2312.  
  2313. Associating Movies With Controllers
  2314. FUNCTION NewMovieController     (theMovie: Movie; movieRect: Rect; 
  2315. someFlags: LongInt): MovieController;
  2316. FUNCTION MCNewAttachedController 
  2317. (mc: MovieController; theMovie: theMovie; 
  2318. w: WindowPtr; where: Point): ComponentResult;
  2319. FUNCTION MCSetMovie     (mc: MovieController; theMovie: Movie; 
  2320. movieWindow: WindowPtr; where: Point): ComponentResult;
  2321. FUNCTION MCGetMovie     (mc: MovieController): Movie;
  2322. PROCEDURE DisposeMovieController
  2323. (mc: MovieController);
  2324. Managing Controller Attributes
  2325. FUNCTION MCPositionController     
  2326. (mc: MovieController; VAR movieRect: Rect; 
  2327. VAR controllerRect: Rect; someFlags: LongInt): ComponentResult;
  2328. FUNCTION MCSetControllerAttached 
  2329. (mc: MovieController; 
  2330. attach: Boolean): ComponentResult;
  2331. FUNCTION MCIsControllerAttached 
  2332. (mc: MovieController): ComponentResult;
  2333. FUNCTION MCSetVisible     (mc: MovieController; visible: Boolean): ComponentResult;
  2334. FUNCTION MCGetVisible    (mc: MovieController): ComponentResult;
  2335. FUNCTION MCDrawBadge     (mc: MovieController; movieRgn: RgnHandle; 
  2336. VAR badgeRgn: RgnHandle): ComponentResult;
  2337. FUNCTION MCSetControllerBoundsRect
  2338. (mc: MovieController; bounds: Rect): ComponentResult;
  2339. FUNCTION MCGetControllerBoundsRect 
  2340. (mc: MovieController; VAR bounds: Rect): ComponentResult;
  2341. FUNCTION MCGetControllerBoundsRgn 
  2342. (mc: MovieController): RgnHandle;
  2343. FUNCTION MCGetWindowRgn     (mc: MovieController; w: WindowPtr): RgnHandle;
  2344. FUNCTION MCSetClip     (mc: MovieController; theClip: RgnHandle;
  2345. movieClip: RgnHandle): ComponentResult;
  2346. FUNCTION MCGetClip     (mc: MovieController; VAR theClip: RgnHandle; VAR movieClip: RgnHandle): ComponentResult;
  2347. FUNCTION MCSetControllerPort    
  2348. (mc: MovieController; gp: CGrafPtr): ComponentResult;
  2349. FUNCTION MCGetControllerPort    
  2350. (mc: MovieController): CGrafPtr;
  2351. Handling Movie Events
  2352. FUNCTION MCIsPlayerEvent     (mc: MovieController; e: EventRecord): ComponentResult;
  2353. FUNCTION MCDoAction     (mc: MovieController; action: Integer; 
  2354. params: Ptr): ComponentResult;
  2355. PROCEDURE MCSetActionFilterWithRefCon
  2356. (mc: MovieController; filter: MCActionFilter; refCon: LongInt);
  2357. FUNCTION MCGetControllerInfo
  2358. (mc: MovieController; VAR someFlags: LongInt): ComponentResult;
  2359. FUNCTION MCMovieChanged     (mc: MovieController; theMovie: Movie): ComponentResult;
  2360. Editing Movies
  2361. FUNCTION MCEnableEditing     (mc: MovieController; enabled: Boolean): ComponentResult;
  2362. FUNCTION MCIsEditingEnabled 
  2363. (mc: MovieController): LongInt;
  2364. FUNCTION MCCut     (mc: MovieController): Movie;
  2365. FUNCTION MCCopy     (mc: MovieController): Movie;
  2366. FUNCTION MCPaste     (mc: MovieController; srcMovie: Movie): ComponentResult;
  2367. FUNCTION MCClear     (mc: MovieController): ComponentResult;
  2368. FUNCTION MCUndo     (mc: MovieController): ComponentResult;
  2369. FUNCTION MCSetUpEditMenu    (mc: MovieController; modifiers: LongInt; 
  2370. mh: MenuHandle): ComponentResult;
  2371. FUNCTION MCGetMenuString    (mc: MovieController; modifiers: LongInt; 
  2372. item: Integer; VAR aString: Str255): ComponentResult;
  2373. Getting and Setting Movie Controller Time
  2374. FUNCTION MCSetDuration     (mc: MovieController; duration: TimeValue): ComponentResult;
  2375. FUNCTION MCGetCurrentTime     (mc: MovieController; VAR scale: TimeScale): TimeValue;
  2376. Customizing Event Processing
  2377. FUNCTION MCActivate     (mc: MovieController; w: WindowPtr; 
  2378. activate: Boolean): ComponentResult;
  2379. FUNCTION MCClick     (mc: MovieController; w: WindowPtr; 
  2380. where: Point; when: LongInt; 
  2381. modifiers: LongInt): ComponentResult;
  2382. FUNCTION MCDraw     (mc: MovieController; w: WindowPtr): ComponentResult;
  2383. FUNCTION MCIdle     (mc: MovieController): ComponentResult;
  2384. FUNCTION MCKey     (mc: MovieController; key: Byte; 
  2385. modifiers: LongInt): ComponentResult;
  2386. Application-Defined Routine
  2387.  
  2388. FUNCTION MyPlayerFilterWithRefCon     
  2389. (mc: MovieController; VAR action: Integer;
  2390. VAR params: LongInt; refCon: LongInt): Boolean;
  2391. Result CodesbadControllerHeight    –9994    Invalid height     
  2392. editingNotAllowed    –9995    Controller does not support editing    
  2393. controllerBoundsNotExact    –9996    Boundary rectangle not exact    
  2394. cannotSetWidthOfAttachedController    –9997    Cannot change controller width    
  2395. controllerHasFixedHeight     –9998    Cannot change controller height    
  2396. cannotMoveAttachedController    –9999    Cannot move attached controllers    
  2397.  
  2398.  
  2399.  
  2400. Listing 3-0
  2401. Table 3-0
  2402. Standard Image-Compression Dialog Components
  2403. Contents
  2404. About Standard Image-Compression Dialog Components3-4
  2405. Using Standard Image-Compression Dialog Components3-6
  2406. Opening a Connection to a Standard Image-Compression Dialog Component3-8
  2407. Displaying the Dialog Box to the User3-8
  2408. Setting Default Parameters3-8
  2409. Designating a Test Image3-9
  2410. Displaying the Dialog Box and Retrieving Parameters3-10
  2411. Extending the Basic Dialog Box3-11
  2412. Creating a Standard Image-Compression Dialog Component3-14
  2413. Standard Image-Compression Dialog Components Reference3-15
  2414. Request Types3-15
  2415. The Spatial Settings Request Type3-15
  2416. The Temporal Settings Request Type3-17
  2417. The Data-Rate Settings Request Type3-19
  2418. The Color Table Settings Request Type3-20
  2419. The Progress Function Request Type3-20
  2420. The Extended Functions Request Type3-21
  2421. The Preference Flags Request Type3-22
  2422. The Settings State Request Type3-24
  2423. The Sequence ID Request Type3-24
  2424. The Window Position Request Type3-25
  2425. The Control Flags Request Type3-25
  2426. Standard Image-Compression Dialog Component Functions3-25
  2427. Getting Default Settings for an Image or a Sequence3-26
  2428. Displaying the Standard Image-Compression Dialog Box3-28
  2429. Compressing Still Images3-29
  2430. Compressing Image Sequences3-31
  2431. Working With Image or Sequence Settings3-34
  2432. Specifying a Test Image3-37
  2433. Positioning Dialog Boxes and Rectangles3-42
  2434. Utility Function3-44
  2435. Application-Defined Function3-45
  2436. Summary of Standard Image-Compression Dialog Components3-47
  2437. C Summary3-47
  2438. Constants3-47
  2439. Data Types3-49
  2440. Standard Image-Compression Dialog Component Functions3-50
  2441. Application-Defined Function3-52
  2442. Pascal Summary3-52
  2443. Constants3-52
  2444. Data Types3-54
  2445. Standard Image-Compression Dialog Component Routines3-55
  2446. Application-Defined Routine3-57
  2447. Result Codes3-57
  2448. Standard Image-Compression Dialog Components
  2449. This chapter discusses standard image-compression dialog components. Standard image-compression dialog components provide a consistent user interface for selecting parameters that govern the compression of an image or image sequence and the management of the compression operation. Applications that use these components are freed from many of the details of obtaining and validating image-compression parameters and interacting with the Image Compression Manager to compress an image or sequence.
  2450. This chapter is divided into the following sections:
  2451. n    “About Standard Image-Compression Dialog Components” provides a general introduction to components of this type.
  2452. n    “Using Standard Image-Compression Dialog Components” discusses the facilities provided to applications by these components.
  2453. n    “Creating a Standard Image-Compression Dialog Component” describes how to create one of these components.
  2454. n    “Standard Image-Compression Dialog Components Reference” presents detailed information about the functions that are supported by these components.
  2455. n    “Summary of Standard Image-Compression Dialog Components” contains a condensed listing of the constants, data structures, and functions supported by these components in C and in Pascal.
  2456. If you want to use a standard image-compression dialog component in your application, you should read the first two sections of this chapter, and then use the reference section as appropriate. If you want to create your own standard image-compression dialog component, you should be familiar with all of the information in this chapter.
  2457. As components, standard image-compression dialog components rely on the facilities 
  2458. of the Component Manager. In order to use any component, your application must also use the Component Manager. If you are not familiar with this manager, see the chapter “Component Manager” in Inside Macintosh: More Macintosh Toolbox. In addition, you should be familiar with image compression in general and the Image Compression Manager in particular. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information.
  2459. Note
  2460. Throughout this chapter, the term standard dialog component refers to the standard image-compression dialog component. The term standard dialog box refers to one or both of the two dialog boxes presented by the standard image-compression dialog component. These dialog boxes are shown in Figure 3-1 and Figure 3-2.u
  2461.  
  2462.  
  2463. About Standard Image-Compression Dialog Components
  2464.  
  2465. Standard image-compression dialog components provide a consistent user interface for specifying the parameters that control the compression of an image or image sequence. Your application specifies a test image for the dialog box and then calls the standard-image compression component. The component then presents a dialog box 
  2466. to the user, manages the dialog box, validates the user’s settings, and stores those settings for your application. The standard dialog component also provides numerous facilities for determining reasonable default settings for a given image or sequence. Finally, this component manages the process of compressing the image or image sequence, using the parameter settings provided by the user or your application.
  2467. By using a standard image-compression dialog component, you can reduce the amount of work you need to do in your application in order to compress an image or an image sequence. For example, you can eliminate the need to manage interactions with the user and to validate the image-compression parameters specified by the user. Furthermore, the standard dialog component simplifies the process of compressing images or sequences. This, in turn, allows you to focus on the problem at hand, rather than on the details of image-compression parameters. In addition, the standard image-compression dialog component supplied by Apple supports many features that are helpful to the user, including Balloon Help and a test image. Finally, Apple’s component will be localized by Apple, so that you need not worry about international issues relating to this dialog box.
  2468. Standard image-compression dialog components support two basic dialog boxes. One dialog box provides a minimal interface and is suitable for compressing single images. Figure 3-1 shows an example of this dialog box. Using this dialog box, the user can select a compressor component, the pixel depth for the operation, and the desired spatial quality.
  2469. Figure 3-1    Dialog box for single-frame compression
  2470.  
  2471. The other dialog box allows the user to set compression parameters for image sequences. In addition to the parameters supported by the single-frame dialog box, this dialog box supports frame rate, key frame rate, spatial and temporal quality settings, and data rate settings (for more information about these aspects of image compression, see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime). Figure 3-2 shows an example of this dialog box.
  2472. Figure 3-2    Dialog box for image-sequence compression
  2473.  
  2474. Your application can control which dialog box is presented to the user.
  2475. By using standard dialog components, you can avoid many of the details of obtaining, validating, and using image-compression parameters. The process of validating 
  2476. image-compression parameters can be very involved, depending upon the capabilities of the selected compressor component. Apple’s standard image-compression dialog component verifies that the user’s settings are valid for the selected compressor. In addition, this component uses a test image to demonstrate the effects of the user’s compression settings.
  2477.  
  2478.  
  2479. Using Standard Image-Compression Dialog Components
  2480.  
  2481. You can use the standard image-compression dialog component to obtain image or image sequence compression parameters from the user and to manage the process of compressing the image or sequence. This component presents a consistent interface to the user and eliminates the need for you to worry about the details of managing this dialog box. Once you have collected the parameter information from the user, you can use the component to instruct the Image Compression Manager to perform the image or sequence compression. Again, the component manages the details for you.
  2482. Because the standard image-compression dialog component is a component, you use 
  2483. the Component Manager to open and close your connection. If you are unfamiliar with components or the Component Manager, see the chapter “Component Manager” in Inside Macintosh: More Macintosh Toolbox. 
  2484. Before you can open a connection to a standard image-compression dialog component, be sure that the Component Manager, Image Compression Manager, and 32-bit Color QuickDraw are available. You can use the Gestalt Manager to determine if these facilities are available. For more information about the Gestalt Manager, see the chapter “Gestalt Manager” in Inside Macintosh: Operating System Utilities. For details on 32-bit Color QuickDraw, see the chapter “Color QuickDraw” in Inside Macintosh: Imaging.
  2485. Once you have established a connection to a standard image-compression dialog component, your application can present the dialog box to the user. The user selects the desired compression parameters and clicks the OK button. The component then stores these parameters for your application, using them, when appropriate, to work with the Image Compression Manager to compress the image or sequence. Figure 3-1 on page 3-4 shows one of the dialog boxes that is supported by the standard image-compression dialog component provided by Apple.
  2486. Every standard image-compression dialog box has its own set of parameter information. This information identifies the compressor component to be used, determines which dialog box is used, and specifies the parameters to be used during the compression operation. This information is stored by the component. You can use functions provided by the component to examine or modify these parameters.
  2487. The standard image-compression dialog component provided by Apple allows you to augment or extend the interface provided by its dialog boxes. This component supports a single custom button. Your application enables this button when it instructs the component to display the dialog box to the user. You provide the code that supports this button in a hook function in your application. In addition, this component allows you to define a filter function—you can use this function to process dialog box events before the component. Figure 3-3 identifies the parts of the dialog box supported by Apple’s standard dialog component.
  2488. Figure 3-3    Elements of the standard image-compression dialog box
  2489.  
  2490. The following sections provide more detailed information about using the standard image-compression dialog component.
  2491. n    “Opening a Connection to a Standard Image-Compression Dialog Component” tells you how to establish a connection between your application and the standard dialog component.
  2492. n    “Displaying the Dialog Box to the User” describes the steps you must follow to display the standard dialog box to the user, retrieve the user’s settings, and compress an image or sequence.
  2493. n    “Extending the Basic Dialog Box” discusses several ways your application can customize the basic dialog box.
  2494. Opening a Connection to a Standard Image-Compression Dialog Component
  2495.  
  2496. As is the case with all components, your application must establish a connection to a standard image-compression dialog component before you can use its services. As with other components, you use the Component Manager’s OpenDefaultComponent functions to connect to a component. You must use the Component Manager’s CloseComponent function to close your application’s connection when you are done.
  2497. Apple provides constants that define the component type and subtype values for standard image-compression dialog components. All of these components have a type value of 'scdi'; you can use the StandardCompressionType constant to specify this value. These components have a subtype value of 'imag'; the StandardCompressionSubType constant defines this value.
  2498. Displaying the Dialog Box to the User
  2499.  
  2500. Once you have opened a connection to a standard image-compression dialog component, you can proceed to display the dialog box to the user. In preparation, you might establish default parameter settings and specify a test image. Your application may then instruct the component to display the dialog box to the user. The following sections discuss each of these steps in more detail.
  2501. Setting Default Parameters
  2502.  
  2503. The standard dialog component stores and manages a set of compression parameters for your application. Before presenting the dialog box to the user, you may want to set default values for these parameters. The standard dialog component provides a number of options for establishing these default values:
  2504.     1.    You may supply an image to the component from which it can derive default settings. The component examines the characteristics of the image and sets appropriate default values. The SCDefaultPictHandleSettings function works with images stored in picture handles; the SCDefaultPictFileSettings function works with images stored in picture files; and the SCDefaultPixMapSettings function works with pixel maps. These functions are discussed in “Getting Default Settings for an Image or a Sequence” beginning on page 3-26.
  2505.     2.    If you have not set any defaults, but you do supply a test image for the dialog, the component examines the test image and derives appropriate default values based upon its characteristics. The next section discusses how to assign a test image to the user dialog box.
  2506.     3.    If you have not set any defaults and do not supply a test image, the component uses its own default values.
  2507.     4.    You may modify the settings by using the SCSetInfo function, which is described on page 3-36. This function gives you a great deal of freedom—you can use it to modify any of the parameters stored by the component.
  2508. If you supply either a test or a default image, the standard dialog component extracts default compression settings from that image, including color table, grayscale information (if appropriate), and compression defaults (if the source image is already compressed). If any of these default values differ from your needs, use the SCSetInfo function to modify the value.
  2509. Designating a Test Image
  2510.  
  2511. The standard image-compression dialog component provided by Apple supports a test image in its dialog box. The component uses this test image to show the user the effect of the current set of compression parameters. Whenever the user changes the dialog box settings, the component applies those parameters to the test image and displays the results in its dialog box. In addition, the standard dialog component may sometimes use the test image to obtain hints about the type of compression operation you expect to perform. In some cases, the component may derive default parameter values by examining the test image.
  2512. The component provides three functions that allow you to specify a dialog box’s test image. Each of these functions uses a different image source—a handle, a picture file, or a pixel map. Your application is responsible for obtaining the image and for disposing of it after you are done.
  2513. The test image portion of the dialog box supported by Apple’s standard image-compression dialog component is a square measuring 80 pixels by 80 pixels. In order to deal with test images that are larger than this area, Apple’s component allows you to specify a part of the image to display. You can specify an area of interest, which indicates a portion of the test image that is to be displayed in the dialog box. If the area of interest is still larger than the display area in the dialog box, the component may shrink the image or crop it (or both) until the image fits.
  2514. Listing 3-1 shows one way to specify a test image. This code fragment uses an image that is stored in a picture file. The program asks the user to specify the file, using the SFGetFilePreview function. The program then opens the image file and instructs the standard image-compression dialog component to use the picture that is stored in the file.
  2515. Listing 3-1    Specifying a test image
  2516.  
  2517. Point                        where;
  2518. ComponentInstance                        ci;
  2519. SFTypeList                        typeList;
  2520. SFReply                        inReply;
  2521. short                        srcPictFRef;
  2522.  
  2523. where.h = where.v = -2;                                            /* center dialog box on the
  2524.                                                  best screen */
  2525. typeList[0] = 'PICT';                                            /* set file type */
  2526.  
  2527. SFGetFilePreview (where, "\p", nil, 1, typeList, nil,
  2528.                     &inReply);
  2529. if (!inReply.good) {                         /* handle error */
  2530. }
  2531.  
  2532. result = FSOpen (inReply.fName, inReply.vRefNum, &srcPictFRef);
  2533. if (result) {                            /* handle error */
  2534. }
  2535.  
  2536. result = SCSetTestImagePictFile 
  2537.             (ci,                                /* component connection */
  2538.             srcPictFRef,                                 /* source picture file */
  2539.             nil,                                /* use the entire image */
  2540.             scPreferScalingAndCropping);    
  2541.                                             /* shrink image and crop it */ 
  2542. if (result) {                                            /* handle error */
  2543. }    
  2544. Displaying the Dialog Box and Retrieving Parameters
  2545.  
  2546. Standard image-compression dialog components provide two functions that display the dialog box to the user and retrieve the user’s compression settings: SCRequestImageSettings and SCRequestSequenceSettings. Both of these functions start with your default parameter settings. Any changes made by the user are stored by the component. You may use the SCGetInfo function to examine these settings.
  2547. The SCRequestImageSettings function obtains image-compression parameters from the user and displays the dialog box that is shown in Figure 3-1 on page 3-4. The SCRequestSequenceSettings function works with sequence-compression parameters, using the dialog box shown in Figure 3-2 on page 3-5. Both of these functions allow you to augment or extend the interface in the dialog box—see “Extending the Basic Dialog Box,” which begins on page 3-11, for more information about extending the basic dialog boxes.
  2548. Listing 3-2 shows how to use the SCRequestImageSettings function to display the dialog box to the user and obtain the resulting image-compression settings. This code fragment obtains the compression parameters from the user and then uses those parameters to compress the image that is stored in the file the user selected in Listing 3-1. The program then stores the compressed image in a different file—this fragment assumes that the destination file has already been selected.
  2549. Listing 3-2    Displaying the dialog box to the user and compressing an image
  2550.  
  2551. ComponentInstance                            ci;                    /* component connection */
  2552. short                            srcPictFRef;                    /* source file */
  2553. short                            dstPictFRef;                    /* destination file */
  2554.  
  2555. result = SCRequestImageSettings(ci);
  2556. if (result < 0) {                                                /* handle error */
  2557. }
  2558. if (result == scUserCancelled) {                                                /* user clicked Cancel
  2559.                                                     button */
  2560. }
  2561. result = SCCompressPictureFile
  2562.             (ci,                                    /* component connection */
  2563.             srcPictFRef,                                     /* source picture file */
  2564.             dstPictFRef);                                     /* dest picture file */
  2565. if (result < 0) {                                                /* handle error */
  2566. }
  2567. Note that, because the standard dialog component stores the compression parameters for you, the new user settings become the default values the next time your application interacts with the user. If this is inappropriate, use one of the mechanisms discussed in “Setting Default Parameters” on page 3-8 to modify those defaults.
  2568. Extending the Basic Dialog Box
  2569.  
  2570. Apple’s standard image-compression dialog component allows you to customize the operation of the user dialog box in a number of ways. First, you can define a filter function. This function, which is a modal-dialog filter function, can process dialog box events before the component does. Your filter function can then perform custom processing that is appropriate to your application. Because the compression dialog box is a movable modal dialog box, you must provide a filter to process update events for your application windows.
  2571. Second, you can define a hook function. This function receives item hits before the standard image-compression dialog component does, and can therefore augment the basic dialog box. For example, your hook function can provide additional validation of the user’s selections.
  2572. Finally, you can define a custom button in the dialog box. You can then use your hook function to detect when the user clicks this button. Your hook function can then extend the dialog box interface by displaying additional dialog boxes, for example.
  2573. You use the scExtendedProcsType request type with the SCSetInfo function to take advantage of these mechanisms for customizing the user dialog box. Listing 3-3 contains code that uses this function to define a custom button in the dialog box. Listing 3-4 contains this application’s hook function.
  2574. Listing 3-3    Defining a custom button in the dialog box
  2575.  
  2576. SCExtendedProcs ep;
  2577.  
  2578. ep.filterProc = MyFilter;                                        /* custom filter function */
  2579. ep.hookProc = MyHook;                                        /* custom hook function */
  2580. ep.refcon = 0;                                        /* reference constant for filter
  2581.                                             and hook functions */
  2582. BlockMove("\pDefaults",ep.customName,32);
  2583.                                         /* custom button name */
  2584. SCSetInfo(ci,scExtendedProcsType,&ep); 
  2585.                                         /* set new extended functions */
  2586. Listing 3-4 shows a hook function that returns the dialog box to its default settings whenever the user clicks the custom button. The standard dialog component calls this function each time the user selects an item in the dialog box. On entry, the hook function receives information about the current dialog box, a pointer to the appropriate standard image-compression dialog parameter block, and a reference constant that is supplied by your application.
  2587. This hook function first checks to see whether the user clicked the custom button. If so, the function changes the current compression settings. 
  2588. Listing 3-4    A sample hook function
  2589.  
  2590. pascal short MyHook(DialogPtr theDialog,short itemHit,
  2591.                             void *params,long refcon)
  2592. {
  2593.     SCSpatialSettings ss;
  2594.     
  2595.     if (itemHit == scCustomItem)                                 {            /* check for custom item */
  2596.         ss.codecType = 'jpeg';                                        /* create new settings */
  2597.         ss.codec = anyCodec;
  2598.         ss.depth = 32;
  2599.         ss.spatialQuality = codecNormalQuality;
  2600.         SCSetInfo(params,                                        /* component connection */
  2601.             scSpatialSettingsType,                                    /* set spatial settings */
  2602.             &ss);                                    /* new spatial settings */
  2603.     }
  2604.     return (itemHit);
  2605. }
  2606. In your hook function, you may want to display additional user dialog boxes. 
  2607. Apple’s standard image-compression dialog component provides two functions that help you position your dialog box on the screen. The SCPositionDialog function places a dialog box in a specified location; the SCPositionRect function positions a rectangle. By using these functions you can position your dialog boxes near the standard dialog box. 
  2608. Listing 3-5 contains code that uses the SCPositionDialog function to place a Standard File Package dialog box onto the same screen as the standard image-compression 
  2609. dialog box.
  2610. Listing 3-5    Positioning related dialog boxes
  2611.  
  2612. Point            where;                                /* positions dialog boxes */
  2613. ComponentInstance                        ci;                    /* component connection */
  2614.  
  2615. where.h = where.v = -2;                                            /* center dialog box on the
  2616.                                                 best screen */
  2617.  
  2618. result = SCPositionDialog (ci,                                             /* component connection */
  2619.             -3999,                         /* resource number of dialog box */
  2620.             &where);                        /* returns upper-left point */
  2621.  
  2622. SFPutFile (where,                                             /* positions the dialog box */
  2623.     "\pSave compressed picture as:", 
  2624.     "\pUntitled", 
  2625.     nil, 
  2626.     &outReply);
  2627.  
  2628.  
  2629. Creating a Standard Image-Compression Dialog Component
  2630.  
  2631. Apple’s standard image-compression dialog component fully implements the functional interface for components of this type. As a result, this component allows you to customize the dialog box by enabling the custom button or by defining a filter function. In most cases your application should be able to use the component that is supplied by Apple. However, if you want to create your own standard image-compression dialog component, you should read this section.
  2632. Apple has defined a component type value for standard image-compression dialog components. All components of this type have the same type and subtype values. You can use the following constants to specify the type and subtype.
  2633. #define            StandardCompressionType                                    'scdi'
  2634. #define            StandardCompressionSubType                                    'imag'
  2635. Apple has defined a functional interface for standard image-compression dialog components. For information about the functions your component must support, see the next section, “Standard Image-Compression Dialog Components Reference.” You can use the following constants to refer to the request codes for each of the functions your component must support.
  2636. #define            scPositionRect                                    2    /* SCPositionRect */
  2637. #define            scPositionDialog                                    3    /* SCPositionDialog */
  2638. #define            scSetTestImagePictHandle                                    4    /* SCSetTestImagePictHandle */
  2639. #define            scSetTestImagePictFile                                    5    /* SCSetTestImagePictFile */
  2640. #define            scSetTestImagePixMap                                    6    /* SCSetTestImagePixMap */
  2641. #define            scGetBestDeviceRect                                    7    /* SCGetBestDeviceRect */
  2642. #define            scRequestImageSettings                                    10    /* SCRequestImageSettings */
  2643. #define            scCompressImage                                    11    /* SCCompressImage */
  2644. #define            scCompressPicture                                    12    /* SCCompressPicture */
  2645. #define            scCompressPictureFile                                    13    /* SCCompressPictureFile */
  2646. #define            scRequestSequenceSettings                                    14    /* SCRequestSequenceSettings */
  2647. #define            scCompressSequenceBegin                                    15    /* SCCompressSequenceBegin */
  2648. #define            scCompressSequenceFrame                                    16    /* SCCompressSequenceFrame */
  2649. #define            scCompressSequenceEnd                                    17    /* SCCompressSequenceEnd */
  2650. #define            scDefaultPictHandleSettings                                    18    /* SCDefaultPictHandleSettings */
  2651. #define            scDefaultPictFileSettings                                    19    /* SCDefaultPictFileSettings */
  2652. #define            scDefaultPixMapSettings                                    20    /* SCDefaultPixMapSettings */
  2653. #define            scGetInfo                                    21    /* SCGetInfo */
  2654. #define            scSetInfo                                    22    /* SCSetInfo */
  2655. #define            scNewGWorld                                    23    /* SCNewGWorld */
  2656.  
  2657.  
  2658. Standard Image-Compression Dialog Components Reference
  2659.  
  2660. This section describes the request types and functions associated with the standard image-compression dialog components and an application-defined function.
  2661. Request Types
  2662.  
  2663. This section describes the request types used by two standard dialog component functions that allow you to work with the current compression settings for an image or a sequence of images. (You can establish these settings in a number of ways; see “Setting Default Parameters” on page 3-8 for more information about your options.)
  2664. You use the SCGetInfo function (described on page 3-34) to retrieve settings information. The SCSetInfo function (described on page 3-36) enables you to modify the settings. 
  2665. These functions can work with a number of different types of settings information. When you call either function, you specify the type of data you want to work with. The following request types are defined:
  2666. #define            scSpatialSettingsType                                'sptl'            /* spatial options */
  2667. #define            scTemporalSettingsType                                'tprl'            /* temporal options */
  2668. #define            scDataRateSettingsType                                'drat'            /* data rate */
  2669. #define            scColorTableType                                'clut'            /* color table */
  2670. #define            scProgressProcType                                'prog'            /* progress function */
  2671. #define            scExtendedProcsType                                'xprc'            /* extended dialog */
  2672. #define            scPreferenceFlagsType                                'pref'            /* preferences */
  2673. #define            scSettingsStateType                                'ssta'            /* all settings */
  2674. #define            scSequenceIDType                                'sequ'            /* sequence ID */
  2675. #define            scWindowPositionType                                'wndw'            /* window position */
  2676. #define            scCodecFlagsType                                'cflg'            /* compression flags */
  2677. Each of these request types requires different parameter data. The following sections discuss each of these request types and their data requirements.
  2678. The Spatial Settings Request Type
  2679.  
  2680. Use the spatial settings request to retrieve or modify the current spatial compression parameters. These parameters control how each image is compressed.
  2681. You supply a pointer to a spatial settings structure. If you are retrieving these settings, the standard dialog component places the current settings into the specified structure; if you are changing the settings, place the new values into the structure—the component uses those values to update its settings.
  2682. The SCSpatialSettings data type defines the format and content of the spatial settings structure:
  2683. typedef struct {
  2684.     CodecType                    codecType;                        /* compressor type */
  2685.     CodecComponent                    codec;                        /* compressor */
  2686.     short                    depth;                        /* pixel depth */
  2687.     CodecQ                    spatialQuality;                        /* desired quality */
  2688. } SCSpatialSettings;
  2689. Field descriptions
  2690. codecType    Specifies the default compressor type that is displayed in the pop-up menu of compressors in the dialog box. The standard image-compression dialog component uses this field to return the compressor type that was selected by the user.
  2691.     You must set this parameter to one of the compressor types supported by the Image Compression Manager, or to nil. 
  2692.     If you set the field to nil, the standard image-compression dialog component uses as the default value the first compressor or compressor type that it retrieves from the Image Compression Manager.
  2693. codec    Provides additional information about the default compressor that is displayed in the pop-up menu of compressors in the dialog box. If the user selects a specific compressor component, the standard image-compression dialog component returns the appropriate compressor identifier in this field.
  2694.     The scListEveryCodec bit in the flag in the scPreferenceFlagsType request influences the operation of the compressor list in the dialog box and, therefore, the way the component uses this field. 
  2695.     Set the flag to 1 to have the list contain an entry for each compressor component in the system. If the flag is set to 1, the standard image-compression dialog component uses this field along with the codecType field to select the default compressor that appears in the dialog box. To specify a default image compressor component, set this field to the appropriate compressor identifier. When the user clicks OK in the dialog box, the standard image-compression dialog component returns the compressor identifier that corresponds to the selected image compressor component.
  2696.     If you set the field to nil, the standard image-compression dialog component uses as the default value the first compressor of the specified type that it retrieves from the Image Compression Manager.
  2697.     If you have set the flag to 0, the list contains only one entry for each type of compressor in the system. The standard image-compression dialog component ignores this field when creating the list of compressor types. In this case, the standard image-compression dialog component does not change the value of this field when the user clicks OK.
  2698.     However, you may use this field to specify additional selection criteria by setting this field to one of the special compressor identifiers supported by the Image Compression Manager (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for these special values). The standard image-compression dialog component may use this value when it validates the compression parameters selected by the user.
  2699. depth    Specifies the default value of the pixel depth pop-up menu in the dialog box. This menu allows the user to select the color or gray scale resolution value to be used when compressing the image or image sequence. If you set this field to 0, the component chooses an appropriate depth for the default compressor you specified with the theCodec field. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for other valid pixel depth values.
  2700.     When the user clicks OK, the standard image-compression dialog component sets this field to the pixel depth value selected by the user. Note that the standard image-compression dialog component may adjust the depth value so that it corresponds to a value that is supported by the compressor that has been selected by the user.
  2701.     The depth returned could be 0 if the scShowBestDepth flag is set.
  2702. spatialQuality
  2703. Specifies the default setting of the quality slider in the dialog box. This slider controls the spatial quality of the compressed image sequence, which influences the amount of spatial compression that can be achieved. Spatial compression eliminates redundant information within each frame in a sequence. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for valid compression quality values.
  2704.     When the user clicks OK, the standard image-compression dialog component sets this field to the spatial quality value selected by the user. Note that the standard image-compression dialog component may adjust the quality value so that it corresponds to a value that is supported by the compressor that has been selected by the user.
  2705. The Temporal Settings Request Type
  2706.  
  2707. Use the temporal settings request to retrieve or modify the current temporal compression parameters. These parameters govern sequence-compression operations. 
  2708. You supply a pointer to a temporal settings structure. If you are retrieving these settings, the standard dialog component places the current settings into the specified structure; if you are changing the settings, place the new values into the structure—the component uses those values to update its settings.
  2709. The SCTemporalSettings data type defines the format and content of the temporal settings structure:
  2710. typedef struct {
  2711.     CodecQ            temporalQuality;                                    /* desired quality */
  2712.     Fixed            frameRate;                                    /* frame rate */
  2713.     long            keyFrameRate;                                    /* key frame rate */
  2714. } SCTemporalSettings;
  2715. Field descriptions
  2716. temporalQuality
  2717. Specifies the default setting of the motion quality slider in the dialog box. This slider controls the temporal quality of 
  2718. the compressed image, which influences the amount of temporal compression that can be achieved (note that Apple’s component uses the same slider for both spatial and temporal quality). Temporal compression eliminates redundant information between frames in an image sequence. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for valid compression quality values.
  2719.     When the user clicks OK, the standard image-compression dialog component sets this field to the temporal quality value selected by the user. Note that the standard image-compression dialog component may adjust the quality value so that it corresponds to a value that is supported by the compressor that has been selected by the user.
  2720. frameRate    Specifies the default value of the text-edit box that controls the number of frames per second in the image sequence to be compressed. This dialog item allows the user to select the frame rate to be used when compressing the image sequence. Note that this field is stored as a fixed-point number, allowing the user to specify fractional frame rates.
  2721.     When the user clicks OK, the standard image-compression dialog component sets this field to the frame rate value specified by the user. If you have set the scAllowZeroFrameRate flag to 1 in the scPreferenceFlagsType request, and the user specifies nothing or 0, the component sets this field to 0.
  2722.     This dialog item can be useful in cases where your application cannot determine the frame rate of the source movie. For example, movies stored in PICT files do not include frame rate information. Therefore, the user must specify a frame rate for you. Alternatively, some users may want to create movies with different frame rates. This item allows the user to specify a rate for the compressed sequence.
  2723. keyFrameRate    Specifies the default value of the text-edit box that controls the frequency with which key frames are inserted into the compressed image sequence. Key frames provide points from which a temporally compressed sequence may be decompressed. For a more complete discussion of key frames, see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime. 
  2724.     When the user clicks OK, the standard image-compression dialog component sets this field to the key frame rate value specified by the user. If you have set the scAllowZeroKeyFrameRate flag to 1 in the scPreferenceFlagsType request, and the user specifies nothing or 0, the component sets this field to 0.
  2725. The Data-Rate Settings Request Type
  2726.  
  2727. Use the data-rate settings request to retrieve or modify the current temporal compression parameters that govern the data rate. These parameters affect sequence-compression operations. 
  2728. You supply a pointer to a data-rate settings structure. If you are retrieving these settings, the standard dialog component places the current settings into the specified structure; if you are changing the settings, place the new values into the structure—the component uses those values to update its settings.
  2729. The SCDataRateSettings data type defines the format and content of the data-rate settings structure:
  2730. typedef struct {
  2731.     long            dataRate;                                /* desired data rate */
  2732.     long            frameDuration;                                /* frame duration */
  2733.     CodecQ            minSpatialQuality;                                /* minimum value */
  2734.     CodecQ            minTemporalQuality;                                /* minimum value */
  2735. } SCDataRateSettings;
  2736. Field descriptions
  2737. dataRate    Specifies the maximum number of bytes of compressed data your application wants to receive per second. Use this parameter to modulate the rate at which the component passes compressed data to your application. This can be useful to account for hardware limitations during sequence playback.
  2738. frameDuration    Indicates the duration of each frame, in milliseconds. Set this parameter to 0 to allow the standard dialog component to calculate the duration based upon the frame rate you specify in an scTemporalSettingsType request. However, if you allow the user to specify a 0 frame rate (that is, you set the scAllowZeroFrameRate flag to 1 in your scPreferenceFlagsType request), you must set the frame duration each time you compress a frame, because the component does not have sufficient information to determine an appropriate rate.
  2739. minSpatialQuality    
  2740. Specifies the minimum acceptable spatial quality. In order to meet your specified data rate, the standard dialog component may have to adjust the spatial quality setting. Use this parameter to set a minimum level, which the component may not exceed. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for values for both this parameter and the minTemporalQuality parameter.
  2741. minTemporalQuality
  2742. Specifies the minimum acceptable temporal quality. As with spatial quality, in order to meet your specified data rate, the standard dialog component may have to adjust the temporal quality setting. Use this parameter to set a minimum level, which the component may not exceed.
  2743. The Color Table Settings Request Type
  2744.  
  2745. Use the color table settings request to retrieve or modify the color table that the standard dialog component uses with all compression operations. Unless you specify otherwise, the component extracts the color table from the source image or sequence.
  2746. You supply a pointer to a color table handle (CTabHandle data type). Your application is responsible for disposing of this handle when you are done with it. Set the pointer to nil to clear the current color table; this may be useful if the current color table is inappropriate for the image or sequence you are working with.
  2747. The Progress Function Request Type
  2748.  
  2749. Use the progress function request to assign a progress function for use by the standard dialog component. The progress function is a part of your application. The 
  2750. standard dialog component calls this function during time-consuming operations, and reports its progress. Your progress function can use the information it receives from the standard dialog component to keep the user informed about the progress of the operation. 
  2751. You supply a pointer to an Image Compression Manager progress function 
  2752. structure (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime 
  2753. for information about the format and content of this structure, as well as complete information about progress functions). Set the pointer to nil to clear the current progress function; in this case, the standard dialog component does not report 
  2754. its progress to the user. Set the pointer to –1 to use the component’s default progress function.
  2755. The Extended Functions Request Type
  2756.  
  2757. Use the extended functions request to extend the interface provided in the standard image or sequence dialog boxes. You may specify a filter function, a hook function, and a custom button; you may retrieve the current settings for these options using the SCGetInfo function.
  2758. You supply a pointer to an extended functions structure. If you are retrieving these settings, the standard dialog component places the current settings into the specified structure; if you are changing the settings, place the new values into the structure—the component uses those values to update its settings. Set this pointer to nil to remove the current functions.
  2759. By default, none of these extended interface elements are used.
  2760. The SCExtendedProcs data type defines the format and content of the extended functions structure:
  2761. typedef struct {
  2762.     SCModalFilterProcPtr                                filterProc;                /* filter function */
  2763.     SCModalHookProcPtr                                hookProc;                /* hook function */
  2764.     long                                refcon;                /* reference constant */
  2765.     Str31                                customName;                /* custom button name */
  2766. } SCExtendedProcs;
  2767. Field descriptions
  2768. filterProc    Contains a pointer to a modal-dialog filter function in your application. Because the compression dialog box is a movable modal dialog box, you must provide a filter to process update events for your application windows. The standard component calls your filter function before it processes the event. You can use this function to control events in the dialog box. For example, you might use the filter function to release processing time to other windows displayed by your application while the standard image-compression dialog box is being displayed. 
  2769.     This is how to declare a filter function named MyFilter:
  2770.                     pascal Boolean MyFilter (DialogPtr theDialog,     
  2771.                                     EventRecord *theEvent, short *itemHit, 
  2772.                                     long refcon);
  2773.     The operation of modal-dialog filter functions is described in the chapter “Dialog Manager” in Inside Macintosh: Macintosh Toolbox Essentials. The refcon parameter contains the reference constant you supply in the refcon field of this structure.
  2774.     If you do not want to specify a filter function, set this parameter 
  2775. to nil.
  2776. hookProc    Contains a pointer to a dialog hook function in your application. The standard component calls your hook function whenever the user selects an item in the dialog box. You can use this function to customize the operation of the standard image-compression dialog box. For example, you might want to support a custom button that activates a secondary dialog box. Another possibility would be to provide additional validation support when the user clicks OK. For an example of defining a custom button, see “Extending the Basic Dialog Box” beginning on page 3-11.
  2777.     This is how to declare a hook function named MyHook:
  2778.                     pascal short MyHook (DialogPtr theDialog, 
  2779.                                             short *itemHit, SCParams *params,
  2780.                                             long refcon);
  2781.     The operation of this dialog hook function is described in “Application-Defined Function,” beginning on page 3-45.
  2782.     If you do not want to specify a hook function, set this parameter 
  2783. to nil.
  2784. refcon    Specifies a reference constant that is to be passed to the dialog hook function and the modal-dialog filter function.
  2785. customName    Specifies the string to be displayed in the custom button in the dialog box. 
  2786.     If you are not using a custom button, set this parameter to nil.
  2787. The Preference Flags Request Type
  2788.  
  2789. Use the preference flags request to specify or retrieve the standard dialog component’s preference flags. These flags govern some of the details of the dialog box that are presented to the user.
  2790. You supply a pointer to a long integer. If you are retrieving these flags, the standard dialog component places the current settings into the specified field; if you are changing the flags, set the field with your desired flag values—the component uses those values to update its settings.
  2791. By default, the SCRequestImageSettings function operates with the scShowBestDepth and scUseMovableModal flags set to 1. The SCRequestSequenceSettings function operates with the scUseMovableModal flag set to 1. You should never need to change the values of the scListEveryCodec or scUseMovableModal flags.
  2792. The following flags are defined:
  2793. #define            scListEveryCodec                            (1L<<1)            /* list every component */
  2794. #define            scAllowZeroFrameRate                            (1L<<2)            /* allow 0 frame rate */
  2795. #define            scAllowZeroKeyFrameRate                                
  2796.                                         (1L<<3)            /* 0 key frame rate OK */
  2797. #define            scShowBestDepth                            (1L<<4)            /* use best image depth */
  2798. #define            scUseMovableModal                            (1L<<5)            /* use movable dialog */
  2799. Flag descriptions
  2800. scListEveryCodec    
  2801. Controls the contents of the pop-up menu of compressors. If you set this flag to 1, the standard image-compression dialog component lists every compressor component that is present in the system. Each entry in the list contains the name of a compressor component. The user may then select a specific component from the list.
  2802.     If you set this flag to 0, the list contains one entry for each type of compressor component that is present in the system. Each list entry contains the name of a compressor type (for example, a list entry might contain “Animation” for the animation compressor). The user may then select a type of compressor—it is your application’s responsibility to select an appropriate compressor of that type.
  2803. scAllowZeroFrameRate
  2804. Determines whether the component allows the user to specify a value of 0 for the frame rate. If you set this flag to 1, the component allows the user to specify either 0 or nothing for the frame rate. The component then includes a “best rate” entry in the pop-up menu. If the user specifies 0, the component sets the frameRate field in the SCTemporalSettings structure to 0. Your application must then determine the best frame rate for the movie.
  2805.     If you set this flag to 0, the component does not allow the user to enter 0 for the frame rate. In this case, the user must select a specific frame rate.
  2806. scAllowZeroKeyFrameRate
  2807. Similar to the scAllowZeroFrameRate flag, this flag determines whether the component allows the user to specify a value of 0 
  2808. for the key frame rate. If you set this flag to 1, the component allows the user to specify 0 for the frame rate. If the user specifies 0, the component sets the keyFrameRate field in the SCTemporalSettings structure to 0. Your application must then determine the best key frame rate for the movie.
  2809.     If you set this flag to 0, the component does not allow the user to specify 0 for the frame rate. In this case, if the user has enabled temporal compression by checking the key frame checkbox, the user must also select a specific key frame rate.
  2810. scShowBestDepth
  2811. Determines whether the component includes a “best depth” entry in the pop-up menu for pixel depth. If you set this flag to 1, the component includes a “best depth” entry in the pop-up menu. If the user selects “best depth,” the component sets the depth to 0. Your application must then determine the best pixel depth for the movie.
  2812.     If you set this flag to 0, the component does not include a “best depth” entry in the pop-up menu. The user must select a depth from among the other available choices.
  2813. scUseMovableModal     
  2814. Determines whether the standard compression dialog is a movable or a stationary dialog. Set this flag to 1 to create a movable dialog. In this case, you should provide an event filter function to handle update events (use the scExtendedProcsType request).
  2815. The Settings State Request Type
  2816.  
  2817. Use the settings state request to set or retrieve the configuration of the standard dialog component. You may use this request to retrieve the configuration information so that you can save it for later use, or to reconfigure the component based on a saved configuration. 
  2818. Your application is not concerned with the content of the configuration information that is returned. The standard dialog component saves its configuration in a format that it understands. This request affects only those settings that are valid across system restarts, such as the spatial and temporal compression parameters and the data-rate settings.
  2819. You supply a pointer to a handle. When you retrieve the settings, the standard dialog component creates an appropriately-sized handle and places its current configuration information into the handle. Your application is responsible for disposing of the handle when you are done with it. 
  2820. When you modify the settings, you supply the configuration information in the handle. The component copies the data out of this handle. Your application is responsible for disposing of the handle when you are done with it. Set the pointer to nil to reset the component to its default configuration.
  2821. The Sequence ID Request Type
  2822.  
  2823. Use the sequence ID request type to retrieve the sequence identifier being used by the component’s SCCompressSequenceFrame function. You may not use this request to set the sequence identifier.
  2824. You supply a pointer to a field of type ImageSequence (this is an Image Compression Manager data type). The standard dialog component returns the current sequence identifier in that field.
  2825. The Window Position Request Type
  2826.  
  2827. Use the window position request to position the user’s dialog box. 
  2828. You supply a pointer to a point. If you are retrieving this information, the standard dialog component places the coordinates of the upper-left corner of the dialog box into this point; if you are changing the dialog box’s position, place the new coordinates into the point structure—the component uses those coordinates to position the dialog box.
  2829. Normally you should not need to use this request. By default, the standard dialog component centers the dialog box on the screen that is best-suited to display your test image. The component also saves the last window position for movable modal dialogs.
  2830. The Control Flags Request Type
  2831.  
  2832. Use the control flags request to retrieve or modify the control flags used by the standard dialog component. The standard dialog component passes these flags through to the image compressor it uses to compress your image or sequence. These flags are Image Compression Manager control flags, as described in the chapter “Image Compression Manager” in Inside Macintosh: QuickTime.
  2833. You supply a pointer to a flags field of data type CodecFlags (this is an Image Compression Manager data type). If you are retrieving the flags, the standard dialog component places the current flags into this field. If you are setting new flag values, place your desired settings into the field—the component uses these new flag settings.
  2834. By default, the standard dialog component sets all flags to 0 when it compresses still images. When it is compressing sequences, the component sets the codecFlagsPreviousUpdate and codecFlagsUpdatePreviousComp flags to 1. Typically, you should not need to change these flag settings.
  2835. Standard Image-Compression Dialog Component Functions
  2836.  
  2837. This section describes the functions that are supported by standard image-compression dialog components. It is divided into the following topics:
  2838. n    “Getting Default Settings for an Image or a Sequence” discusses how you can use the standard dialog component to derive default compression settings for an image or a sequence.
  2839. n    “Displaying the Standard Image-Compression Dialog Box” tells you how to present the standard dialog box to the user.
  2840. n    “Compressing Still Images” discusses functions that allow you to compress still images.
  2841. n    “Compressing Image Sequences” discusses functions that allow you to compress image sequences.
  2842. n    “Working With Image or Sequence Settings” describes the functions and data structures you can use to modify the compression settings stored by the standard dialog component.
  2843. n    “Specifying a Test Image” tells you how you can specify the image that is displayed to the user in the standard dialog box.
  2844. n    “Positioning Dialog Boxes and Rectangles” provides information about a number of functions that allow you to position dialog boxes and rectangles that may be related to the standard dialog box.
  2845. n    “Utility Function” discusses a utility function that the standard dialog component provides to your application.
  2846. Getting Default Settings for an Image or a Sequence
  2847.  
  2848. This section describes the functions that allow you to derive sensible default compression settings for an image or a sequence. The standard dialog component examines an image you provide and selects appropriate default settings based on the image’s characteristics. The component stores those settings for you and uses them with other functions, including not only functions governing image or sequence compression, but also utility functions such as SCNewGWorld. If you choose to display a dialog box to the user, the component uses these settings as the default dialog box settings.
  2849. Any of these functions may be used with a single image or an image that is part of 
  2850. a sequence. You tell the standard dialog component whether the image is part of a sequence when you call the function.
  2851. If there is a custom color table associated with the image or the sequence, these functions retrieve and store it. You can use the color table settings request (described on page 3-20) to retrieve the custom color table and obtain as much color and depth information as possible from the image or sequence of images.
  2852. You can retrieve these settings using the SCGetInfo function, or modify them using the SCSetInfo function, which are described on page 3-34 and page 3-36, respectively.
  2853. There are three functions available: SCDefaultPictHandleSettings works with pictures, SCDefaultPictFileSettings works with picture files, and SCDefaultPixMapSettings works with pixel maps.
  2854. SCDefaultPixMapSettings
  2855.  
  2856. The SCDefaultPixMapSettings function allows you to derive default compression settings for an image that is stored in a pixel map.
  2857. pascal ComponentResult SCDefaultPixMapSettings 
  2858.                                 (ComponentInstance ci, PixMapHandle src,
  2859.                                  short motion);
  2860. ci    Identifies your application’s connection to a standard image-compression dialog component. You obtain this identifier from the Component Manager’s OpenDefaultComponent function.
  2861. src    Contains a handle to the pixel map to be analyzed.
  2862. motion    Specifies whether the image is part of a sequence. Set this parameter to true if the image is part of a sequence; set it to false if you are working with a single still image.
  2863. SCDefaultPictHandleSettings
  2864.  
  2865. The SCDefaultPictHandleSettings function allows you to derive default compression settings for a picture that is stored in a handle.
  2866. pascal ComponentResult SCDefaultPictHandleSettings
  2867.                                              (ComponentInstance ci, 
  2868.                                                 PicHandle srcPicture, 
  2869.                                                 short motion);
  2870. ci    Identifies your application’s connection to a standard image-compression dialog component. You obtain this identifier from the Component Manager’s OpenDefaultComponent function.
  2871. srcPicture
  2872. Contains a handle to the picture to be analyzed.
  2873. motion    Specifies whether the image is part of a sequence. Set this parameter to true if the image is part of a sequence; set it to false if you are working with a single still image.
  2874. SCDefaultPictFileSettings
  2875.  
  2876. The SCDefaultPictFileSettings function allows you to derive default compression settings for a picture that is stored in a file.
  2877. pascal ComponentResult SCDefaultPictFileSettings
  2878.                                     (ComponentInstance ci, short srcRef, 
  2879.                                          short motion);
  2880. ci    Identifies your application’s connection to a standard image-compression dialog component. You obtain this identifier from the Component Manager’s OpenDefaultComponent function.
  2881. srcRef    Contains a reference to the file to be analyzed.
  2882. motion    Specifies whether the image is part of a sequence. Set this parameter to true if the image is part of a sequence; set it to false if you are working with a single still image.
  2883. RESULT CODES
  2884. File Manager errors
  2885. Displaying the Standard Image-Compression Dialog Box
  2886.  
  2887. Standard image-compression dialog components provide two functions that allow you to display the standard dialog box to the user and retrieve the compression parameters specified by the user. 
  2888. Use the SCRequestImageSettings function to retrieve the user’s preferences for compressing a single image; use the SCRequestSequenceSettings functions when you are working with an image sequence.
  2889. Both of these functions manipulate the compression settings that the component stores for you. The component may derive the current settings from a number of different sources:
  2890. n    You may supply an image to the component from which it can derive default 
  2891. settings. You do this by using one of the functions discussed in 
  2892. “Getting Default Settings for an Image or a Sequence” beginning on page 3-26.
  2893. n    If you have not set any defaults, but you do supply a test image for the dialog, the component examines the test image and derives appropriate default values based upon its characteristics.
  2894. n    If you have not set any defaults and do not supply a test image, the component uses its own default values.
  2895. n    You may modify the settings by using the SCSetInfo function, which is described on page 3-36.
  2896. n    You may allow the user to modify those settings by calling one of the functions discussed in this section.
  2897. You may customize the dialog boxes by specifying a modal-dialog hook function or a custom button. You may use the custom button to invoke an ancillary dialog box that is specific to your application. See “Request Types” beginning on page 3-15 for more information.
  2898. SCRequestImageSettings
  2899.  
  2900. The SCRequestImageSettings function displays the standard image dialog box 
  2901. to the user; the dialog box is populated with the default settings you have established.
  2902. pascal ComponentResult SCRequestImageSettings 
  2903.                                                     (ComponentInstance ci);
  2904. ci    Identifies your application’s connection to a standard image-compression dialog component.
  2905. DESCRIPTION
  2906. The standard dialog component retrieves and validates the user’s selections, and 
  2907. saves the resulting settings for use later.
  2908. Use this function when you are working with a single still image.
  2909. RESULT CODESscUserCancelled    1    Dialog box canceled—user clicked Cancel    
  2910. paramErr    –50    Invalid parameter value    
  2911.  
  2912. SCRequestSequenceSettings
  2913.  
  2914. The SCRequestSequenceSettings function displays the standard sequence dialog box to the user; the dialog box uses the default settings you have established. 
  2915. pascal ComponentResult SCRequestSequenceSettings         
  2916.                                                     (ComponentInstance ci);
  2917. ci    Identifies your application’s connection to a standard image-compression dialog component.
  2918. DESCRIPTION
  2919. The standard dialog component retrieves and validates the user’s selections, and 
  2920. saves the resulting settings for use later.
  2921. Use this function when you are working with an image sequence.
  2922. RESULT CODESscUserCancelled    1    Dialog box canceled—user clicked Cancel    
  2923. paramErr    –50    Invalid parameter value    
  2924.  
  2925. Compressing Still Images
  2926.  
  2927. The standard dialog component provides three functions you may use to compress a still image. These functions differ based on how the image is stored: SCCompressImage works with pixel maps; SCCompressPicture compresses a picture that is stored in a handle; and SCCompressPictureFile works with pictures stored in files.
  2928. All of these functions use the current compression settings. See “Displaying the Standard Image-Compression Dialog Box” beginning on page 3-28 for detailed information about establishing these current settings.
  2929. If there are no default settings, each of these functions could potentially display the dialog box for single-frame compression operations shown in Figure 3-1 on page 3-4.
  2930. SCCompressImage
  2931.  
  2932. The SCCompressImage function compresses an image that is stored in a pixel map.
  2933. pascal ComponentResult SCCompressImage (ComponentInstance ci,
  2934.                                                 PixMapHandle src, 
  2935.                                                 Rect *srcRect,
  2936.                                                  ImageDescriptionHandle *desc, 
  2937.                                                 Handle *data);
  2938. ci    Identifies your application’s connection to a standard image-compression dialog component.
  2939. src    Contains a handle to the pixel map to be compressed.
  2940. srcRect    Contains a pointer to a portion of the pixel map to compress. This rectangle must be in the pixel map’s coordinate system. If you want to compress the entire pixel map, set this parameter to nil.
  2941. desc    Contains a pointer to an image description handle. The standard dialog component creates an image description structure when it compresses the image, and returns a handle to that structure in the field referred to by this parameter. The component sizes that handle appropriately. Your application is responsible for disposing of that handle when you are done with it.
  2942. data    Contains a pointer to a handle. The standard dialog component returns a handle to the compressed image data in the field referred to by this parameter. The component sizes that handle appropriately. Your application is responsible for disposing of that handle when you are done with it.
  2943. RESULT CODESscUserCancelled    1    Dialog box canceled—user clicked Cancel    
  2944.  
  2945. Image Compression Manager errors (from FCompressImage function)
  2946. SCCompressPicture
  2947.  
  2948. The SCCompressPicture function compresses a picture that is stored in a handle.
  2949. pascal ComponentResult SCCompressPicture (ComponentInstance ci,
  2950.                                                          PicHandle srcPicture,
  2951.                                                          PicHandle dstPicture);
  2952. ci    Identifies your application’s connection to a standard image-compression dialog component.
  2953. srcPicture
  2954. Contains a handle to the picture to be compressed.
  2955. dstPicture
  2956. Contains a handle to the compressed picture. The standard dialog component resizes this handle to accommodate the compressed picture. Your application is responsible for creating and disposing of this handle when you are done with it.
  2957. RESULT CODESscUserCancelled    1    Dialog box canceled—user clicked Cancel    
  2958.  
  2959. Image Compression Manager errors (from FCompressPicture function)
  2960. SCCompressPictureFile
  2961.  
  2962. The SCCompressPictureFile function compresses a picture that is stored in a file.
  2963. pascal ComponentResult SCCompressPictureFile 
  2964.                                         (ComponentInstance ci, 
  2965.                                          short srcRefNum, short dstRefNum);
  2966. ci    Identifies your application’s connection to a standard image-compression dialog component.
  2967. srcRefNum    Contains a reference to the file to be compressed.
  2968. dstRefNum    Contains a reference to the file that is to receive the compressed data. This may be the same as the source file. The standard dialog component places the compressed image data into the file identified by this reference. Your application is responsible for this file after the compression operation.
  2969. RESULT CODESscUserCancelled    1    Dialog box canceled—user clicked Cancel    
  2970.  
  2971. Image Compression Manager errors (from FCompressPictureFile function)
  2972. Compressing Image Sequences
  2973.  
  2974. The standard dialog component provides three functions you may use to compress an image sequence. The SCCompressSequenceBegin function allows you to start a sequence-compression operation; use the SCCompressSequenceFrame function for each image in the sequence; you end the sequence by calling the SCCompressSequenceEnd function. The standard dialog component manages all of the compression details for you. Your application may have only one sequence-compression operation active on any given connection; naturally, you may have more than one connection active at a time.
  2975. All of these functions use the current compression settings. See “Displaying the Standard Image-Compression Dialog Box” beginning on page 3-28 for detailed information about establishing these current settings.
  2976. If there are no default settings, each of these functions could potentially display the dialog box for sequence-compression operations shown in Figure 3-2 on page 3-5.
  2977. SCCompressSequenceBegin
  2978.  
  2979. The SCCompressSequenceBegin function initiates a sequence-compression operation. You supply the first image in the sequence so that the component can determine its spatial and graphical characteristics.
  2980. pascal ComponentResult SCCompressSequenceBegin 
  2981.                                         (ComponentInstance ci, 
  2982.                                             PixMapHandle src, Rect *srcRect, 
  2983.                                             ImageDescriptionHandle *desc);
  2984. ci    Identifies your application’s connection to a standard image-compression dialog component.
  2985. src    Contains a handle to the pixel map to be compressed. This pixel map must contain the first image in the sequence.
  2986. srcRect    Contains a pointer to a portion of the pixel map to compress. This rectangle must be in the pixel map’s coordinate system. If you want to compress the entire pixel map, set this parameter to nil.
  2987. desc    Contains a pointer to an image description handle. The standard dialog component creates an image description structure when it compresses the image, and returns a handle to that structure in the field referred to by this parameter. The component sizes the handle appropriately. If you do not want this information, set this parameter to nil.
  2988.     The returned structure is valid for the entire sequence. The standard dialog component disposes of the handle when you end the sequence by calling the SCCompressSequenceEnd function. Your application must not dispose of this handle by any other means.
  2989. RESULT CODES
  2990. Memory Manager errors
  2991. Image Compression Manager errors (from CompressSequenceBegin function)
  2992. SCCompressSequenceFrame
  2993.  
  2994. The SCCompressSequenceFrame function continues a sequence-compression operation. You must call this function once for each frame in the sequence, including the first frame.
  2995. pascal ComponentResult SCCompressSequenceFrame 
  2996.                                 (ComponentInstance ci, PixMapHandle src, 
  2997.                                  Rect *srcRect, Handle *data, 
  2998.                                  long *dataSize, short *notSyncFlag);
  2999. ci    Identifies your application’s connection to a standard image-compression dialog component.
  3000. src    Contains a handle to the pixel map to be compressed. 
  3001. srcRect    Contains a pointer to a portion of the pixel map to compress. This rectangle must be in the pixel map’s coordinate system. If you want to compress the entire pixel map, set this parameter to nil.
  3002. data    Contains a pointer to a handle. The standard dialog component returns a handle to the compressed image data in the field referred to by this parameter. The component sizes that handle appropriately for the sequence. 
  3003.     Your application must not dispose of this handle. The standard dialog component disposes of the handle when you end the sequence by calling the SCCompressSequenceEnd function. If you need to lock the handle, be sure to save and restore the handle’s state.
  3004. dataSize    Contains a pointer to a long integer. The standard dialog component returns a value that indicates the number of bytes of compressed image data that it returns. Note that this value will differ from the size of the handle referred to by the data parameter, because the handle is allocated to accommodate the largest image in the sequence.
  3005. notSyncFlag    
  3006. Contains a pointer to a short integer that indicates whether the compressed frame is a key frame. If the frame is a key frame, the standard dialog component sets the field referred to by this parameter to 0; otherwise, the component sets this field to mediaSampleNotSync. You may use this field to set the sampleFlags parameter of the Movie Toolbox’s AddMediaSample function.
  3007. RESULT CODESscUserCancelled    1    Dialog box canceled—user clicked Cancel    
  3008.  
  3009. Image Compression Manager errors (from CompressSequenceFrame function)
  3010. SCCompressSequenceEnd
  3011.  
  3012. The SCCompressSequenceEnd function ends a sequence-compression operation. The standard dialog component disposes of any memory it used to compress the image sequence, including the data and image description buffers. You must call this function once for each sequence you start.
  3013. pascal ComponentResult SCCompressSequenceEnd 
  3014.                                             (ComponentInstance ci);
  3015. ci    Identifies your application’s connection to a standard image-compression dialog component.
  3016. Working With Image or Sequence Settings
  3017.  
  3018. The standard dialog component provides two functions that allow you to work with the current compression settings for an image or a sequence of images. You can establish these settings in a number of ways: see “Setting Default Parameters” on page 3-8 for more information about your options.
  3019. You use the SCGetInfo function to retrieve settings information. The SCSetInfo function enables you to modify the settings. 
  3020. These functions can work with a number of different types of settings information. When you call either function, you specify the type of data you want to work with. Each of these request types requires different parameter data. See “Request Types” beginning on page 3-15 for a description of each of these request types and their data requirements.
  3021. SCGetInfo
  3022.  
  3023. The SCGetInfo function allows you to retrieve configuration information from the standard dialog component. 
  3024. pascal ComponentResult SCGetInfo (ComponentInstance ci, 
  3025.                                              OSType type, void *info);
  3026. ci    Identifies your application’s connection to a standard image-compression dialog component.
  3027. type    Specifies the type of information you want to retrieve. The following values are valid:
  3028. scSpatialSettingsType
  3029. The component returns its spatial compression parameters.
  3030. scTemporalSettingsType
  3031. The component returns its temporal compression parameters.
  3032. scDataRateSettingsType
  3033. The component returns information about its compression data rate.
  3034. scColorTableType    
  3035. The component returns its color table.
  3036. scProgressProcType
  3037. The component returns a pointer to its progress function.
  3038. scExtendedProcsType
  3039. The component returns information about how you have extended the standard dialog box.
  3040. scPreferenceFlagsType
  3041. The component returns its current preference flags settings.
  3042. scSettingsStateType
  3043. The component returns its complete configuration.
  3044. scSequenceIDType    
  3045. The component returns its current image-compression sequence identifier.
  3046. scWindowPositionType
  3047. The component returns information about where the standard dialog is positioned.
  3048. scCodecFlagsType    
  3049. The component returns its current image-compression control flags.
  3050. info    Contains a pointer to a field that is to receive the information. 
  3051. DESCRIPTION
  3052. You use the type parameter to specify the type of information you want to retrieve. The info parameter contains a pointer to a location to receive the information (see this section’s introductory text for information about the format of the data that is returned for each request type). If the component cannot satisfy your request, it returns a result code of scTypeNotFoundErr.
  3053. RESULT CODEscTypeNotFoundErr    –8971    Component does not have the information you want    
  3054.  
  3055. SCSetInfo
  3056.  
  3057. The SCSetInfo function allows you to modify the standard dialog component’s configuration information. 
  3058. pascal ComponentResult SCSetInfo (ComponentInstance ci, 
  3059.                                                     OSType type, void *info);
  3060. ci    Identifies your application’s connection to a standard image-compression dialog component.
  3061. type    Specifies the type of information you want to modify. The following values are valid:
  3062. scSpatialSettingsType
  3063. Modifies the component’s spatial compression parameters.
  3064. scTemporalSettingsType
  3065. Modifies the component’s temporal compression parameters.
  3066. scDataRateSettingsType
  3067. Modifies the component’s compression data rate.
  3068. scColorTableType    
  3069. Modifies the component’s color table.
  3070. scProgressProcType
  3071. Modifies the component’s progress function.
  3072. scExtendedProcsType
  3073. Allows you to extend the standard dialog box.
  3074. scPreferenceFlagsType
  3075. Modifies the component’s preference flags settings.
  3076. scSettingsStateType
  3077. Configures the component, based on a saved configuration.
  3078. scWindowPositionType
  3079. Positions the standard dialog box.
  3080. scCodecFlagsType    
  3081. Modifies the component’s image-compression control flags.
  3082. info    Contains a pointer to a field that contains the new configuration information. 
  3083. DESCRIPTION
  3084. You use the type parameter to specify the type of information you want to modify. The info parameter contains a pointer to a location that contains the new information (see “Request Types” beginning on page 3-15 for information about the format of the data you must supply for each request type). If the component cannot satisfy your request, it returns a result code of scTypeNotFoundErr.
  3085. RESULT CODEscTypeNotFoundErr    –8971    Component does not have the information you want    
  3086.  
  3087. Specifying a Test Image
  3088.  
  3089. The standard image-compression dialog component provided by Apple supports a test image. As you can see in Figure 3-3 on page 3-7, the dialog box contains a small image along with the other parts of the dialog box. The component uses this image to display the effect of the user’s image-compression settings. In this manner, the user can experiment with different settings and see the results of those settings immediately.
  3090. The component provides three functions that allow you to specify the test image. 
  3091. Use the SCSetTestImagePictHandle function if your test image is stored in a 
  3092. handle. Use the SCSetTestImagePictFile function if your test image is in a picture file. The SCSetTestImagePixMap function sets the test image from a pixel map.
  3093. SCSetTestImagePictHandle
  3094.  
  3095. The SCSetTestImagePictHandle function sets the dialog box’s test image from a picture that is stored in a handle.
  3096. pascal ComponentResult SCSetTestImagePictHandle 
  3097.                             (ComponentInstance ci, PicHandle testPict,
  3098.                              Rect *testRect, short testFlags);
  3099. ci    Identifies your application’s connection to a standard image-compression dialog component. 
  3100. testPict    Identifies a handle that contains the new test image. Your application is responsible for disposing of this handle when you are done with it. You must clear the image or close your connection to the standard image-compression dialog component before you dispose of this handle or close the corresponding resource file. You must set this handle as nonpurgeable.
  3101.     Set this parameter to nil to clear the test image.
  3102. testRect    Contains a pointer to a rectangle structure. This rectangle specifies, in the coordinate system of the source image, the area of interest or point of interest in the test image. The area of interest defines a portion of the test image that is to be shown to the user in the dialog box. Use this parameter to direct the component to a specific portion of the test image. The component uses the value of the testFlags parameter to determine how it transforms this image before displaying it to the user. The component uses the testFlags parameter only when the test image is larger than the test image portion of the dialog box.
  3103.     You may specify a point of interest by setting the points in the rectangle structure so that they enclose a single point—for example, (0,0) and (1,1). The component centers this point in the image that is displayed in the dialog box, and displays the part of the image that fits in the test image portion of the dialog box. 
  3104.     To use the entire picture, specify nil in this parameter.
  3105. testFlags    Specifies how the component is to display a test image that is larger 
  3106. than the test image portion of the dialog box. If you set this parameter to 0, the component uses a default method of its own choosing. In all cases, the component centers the area or point of interest in the test image portion of the dialog box, and then displays some part of the test image.
  3107.     You may indicate your display preference by setting this parameter to one of the following values:
  3108. scPreferCropping
  3109. Indicates that the component should crop the test image to fit the test image portion of the dialog box. The component displays the part of the image that fits in the test image portion of the box. If the image is smaller than the space allotted in the dialog box, the component does not alter the image before displaying it—the resulting image is smaller than the available space.
  3110. scPreferScaling
  3111. Indicates that the component should scale the test image 
  3112. to fit the test image portion of the dialog box. The component shrinks the image to fit the test image portion of the dialog box.
  3113. scPreferScalingAndCropping
  3114. Indicates that the component should both scale and crop the test image. This option is useful with very large test images. The component first shrinks the image to approximately the size of the test image portion of the dialog box, and then trims the image so that it fits the available space.
  3115. RESULT CODEparamErr    –50    Invalid parameter specified    
  3116.  
  3117. SCSetTestImagePictFile
  3118.  
  3119. The SCSetTestImagePictFile function sets the dialog box’s test image from a picture that is stored in a picture file.
  3120. pascal ComponentResult SCSetTestImagePictFile 
  3121.                                 (ComponentInstance ci, short testFileRef,
  3122.                                     Rect *testRect, short testFlags);
  3123. ci    Identifies your application’s connection to a standard image-compression dialog component.
  3124. testFileRef
  3125. Identifies the file that contains the new test image. Your application is responsible for opening this file before calling this function. You must also close the file when you are done with it. You must clear the image or close your connection to the standard image-compression dialog component before you close the file. If the file contains a large image, the component may take some time to display the standard image-compression dialog box. In this case, the component displays the watch cursor while it loads the test image.
  3126.     Set this parameter to 0 to clear the test image.
  3127. testRect    Contains a pointer to a rectangle structure. This rectangle specifies, in the coordinate system of the source image, the area of interest or point of interest in the test image. The area of interest defines a portion of the test image that is to be shown to the user in the dialog box. Use this parameter to direct the component to a specific portion of the test image. The component uses the value of the testFlags parameter to determine how it transforms large images before displaying them to the user. 
  3128.     You may specify a point of interest by setting the points in the rectangle structure so that they enclose a single point—for example, (0,0) and (1,1). The component centers this point in the image that is displayed in the dialog box, and displays the part of the image that fits in the test image portion of the dialog box. 
  3129.     To use the entire picture file, pass nil in this parameter.
  3130. testFlags    Specifies how the component is to display a test image that is larger 
  3131. than the test image portion of the dialog box. If you set this parameter 
  3132. to 0, the component uses a default method of its own choosing. In all cases, the component centers the area or point of interest in the test image portion of the dialog box, and then displays some part of the test image.
  3133.     You may indicate your display preference by setting this parameter to one of the following values:
  3134. scPreferCropping
  3135. Indicates that the component should crop the test image to fit the test image portion of the dialog box. The component displays the part of the image that fits in the test image portion of the box. If the image is smaller than the space alloted in the dialog box, the component does not alter the image before displaying it—the resulting image is smaller than the available space.
  3136. scPreferScaling
  3137. Indicates that the component should scale the test image 
  3138. to fit the test image portion of the dialog box. The component shrinks the image to fit the test image portion of the dialog box.
  3139. scPreferScalingAndCropping
  3140. Indicates that the component should both scale and crop the test image. This option is useful with very large test images. The component first shrinks the image to approximately the size of the test image portion of the dialog box, then trims the image so that it fits the available space.
  3141. RESULT CODESparamErr    –50    Invalid parameter specified    
  3142.  
  3143. File Manager errors
  3144. SCSetTestImagePixMap
  3145.  
  3146. The SCSetTestImagePixMap function sets the dialog box’s test image from a picture that is stored in a pixel map.
  3147. pascal ComponentResult SCSetTestImagePixMap (ComponentInstance ci,
  3148.                                                     PixMapHandle testPixMap,
  3149.                                                     Rect *testRect,
  3150.                                                     short testFlags);
  3151. ci    Identifies your application’s connection to a standard image-compression dialog component. 
  3152. testPixMap
  3153. Contains a handle to a pixel map that contains the new test image. Your application is responsible for creating this pixel map before calling this function. You must also dispose of the pixel map when you are done with it. You must clear the image or close your connection to the standard image-compression dialog component before you dispose of the pixel map. 
  3154.     Set this parameter to nil to clear the test image.
  3155. testRect    Contains a pointer to a rectangle structure. This rectangle specifies, in the coordinate system of the source image, the area of interest or point of interest in the test image. The area of interest defines a portion of the test image that is to be shown to the user in the dialog box. Use this parameter to direct the component to a specific portion of the test image. The component uses the value of the testFlags parameter to determine how it transforms large images before displaying them to the user. 
  3156.     You may specify a point of interest by setting the points in the rectangle structure so that they enclose a single point—for example, (0,0) and (1,1). The component centers this point in the image that is displayed in the dialog box, and displays the part of the image that fits in the test image portion of the dialog box. 
  3157.     To use the entire pixel map, specify nil in this parameter.
  3158. testFlags    Specifies how the component is to display a test image that is larger 
  3159. than the test image portion of the dialog box. If you set this parameter 
  3160. to 0, the component uses a default method of its own choosing. In all cases, the component centers the area or point of interest in the test image portion of the dialog box, and then displays some part of the test image.
  3161.     You may indicate your display preference by setting this parameter to one of the following values:
  3162. scPreferCropping
  3163. Indicates that the component should crop the test image to fit the test image portion of the dialog box. The component displays the part of the image that fits in the test image portion of the box. If the image is smaller than the space alloted in the dialog box, the component does not alter the image before displaying it—the resulting image is smaller than the available space.
  3164. scPreferScaling
  3165. Indicates that the component should scale the test image 
  3166. to fit the test image portion of the dialog box. The component shrinks the image to fit the test image portion of the dialog box.
  3167. scPreferScalingAndCropping
  3168. Indicates that the component should both scale and crop the test image. This option is useful with very large test images. The component first shrinks the image to approximately the size of the test image portion of 
  3169. the dialog box, then trims the image so that it fits the available space.
  3170. RESULT CODEparamErr    –50    Invalid parameter specified    
  3171.  
  3172. Positioning Dialog Boxes and Rectangles
  3173.  
  3174. Standard image-compression dialog components provide functions that allow you to position rectangles and dialog boxes. These functions are most useful in helping you to manage dialog boxes that are related to the standard image-compression dialog. For example, your application might support a custom button that initiates a dialog box with the user to specify additional compression parameters. You can use these functions to position that dialog box in relation to the standard image-compression dialog box.
  3175. There are two positioning functions: the SCPositionRect function positions a rectangle; the SCPositionDialog positions a dialog box. The SCGetBestDeviceRect function returns information about the best available display device.
  3176. SCPositionRect
  3177.  
  3178. The SCPositionRect function positions a rectangle on the screen. You indicate where you want to put the rectangle by specifying the desired coordinates of the upper-left corner of the rectangle.
  3179. pascal ComponentResult SCPositionRect (ComponentInstance ci,
  3180.                                                     Rect *rp, Point *where);
  3181. ci    Identifies your application’s connection to a standard image-compression dialog component. 
  3182. rp    Contains a pointer to a rectangle structure. When you call the SCPositionRect function, this structure should contain the rectangle’s current global coordinates. The SCPositionRect function adjusts the coordinates in the structure to reflect the rectangle’s new position.
  3183. where    Contains a pointer to a point in global coordinates identifying the desired location of the upper-left corner of the rectangle. This parameter allows your application to position the rectangle on the screen.
  3184.     The standard image-compression dialog component supports two special values for this parameter. If you set this parameter to (–1,–1), the component places the rectangle on the display device that has the menu bar. The component centers the rectangle horizontally on that device. The component vertically positions the rectangle so that 1/3 of the vertical space that is not used by the rectangle remains above the rectangle, and the remaining 2/3 of the unused space is below the rectangle.
  3185.     If you set this parameter to (–2,–2), the component places the rectangle 
  3186. on the display device that supports the highest color or grayscale resolution. The component positions the rectangle as it does for the other special value. This option displays images most clearly and is the recommended value for most cases.
  3187.     The SCPositionRect function adjusts the coordinates of this point to correspond to the upper-left corner of the rectangle.
  3188. RESULT CODEparamErr    –50    Invalid parameter specified    
  3189.  
  3190. SCPositionDialog
  3191.  
  3192. The SCPositionDialog function helps you to position a dialog box on the screen. 
  3193. pascal ComponentResult SCPositionDialog (ComponentInstance ci,
  3194.                                                         short id, Point *where);
  3195. ci    Identifies your application’s connection to a standard image-compression dialog component. 
  3196. id    Specifies the resource number of a 'DLOG' resource. The SCPositionDialog function positions the dialog box that corresponds to this resource.
  3197. where    Contains a pointer to a point in global coordinates identifying the desired location of the upper-left corner of the dialog box. This parameter allows you to indicate how you want to position the dialog box on the screen.
  3198.     The standard image-compression dialog component supports two special values for this parameter. If you set this parameter to (–1,–1), the component places the dialog box on the display device that has the menu bar. The component centers the dialog box horizontally on that device. The component vertically positions the dialog box so that 1/3 of the vertical space that is not used by the box remains above the box, and the remaining 2/3 of the unused space is below the box.
  3199.     If you set this parameter to (–2,–2), the component places the dialog box on the display device that supports the highest color or gray scale resolution. The component positions the dialog box as it does for the other special value. This option displays images most clearly and is the recommended value for most cases.
  3200.     The SCPositionDialog function adjusts the coordinates of this point to correspond to the upper-left corner of the dialog box.
  3201. DESCRIPTION
  3202. You indicate where you want to put the dialog box by specifying the desired coordinates of the upper-left corner of the box. The component then derives appropriate location information for the dialog box based upon its size and the display characteristics of the destination device, and returns that location information to your program. You can then pass that information to the Dialog Manager when you want to display the dialog box.
  3203. RESULT CODESparamErr    –50    Invalid parameter specified    
  3204.  
  3205. Resource Manager errors
  3206. SCGetBestDeviceRect
  3207.  
  3208. The SCGetBestDeviceRect function determines the boundary rectangle that surrounds the display device that supports the largest color or grayscale palette. 
  3209. pascal ComponentResult SCGetBestDeviceRect (ComponentInstance ci,
  3210.                                                             Rect *r);
  3211. ci    Identifies your application’s connection to a standard image-compression dialog component. 
  3212. r    Contains a pointer to a rectangle structure. The SCGetBestDeviceRect function returns the global coordinates of a rectangle that surrounds the appropriate display device.
  3213. DESCRIPTION
  3214. The SCGetBestDeviceRect function determines the boundary rectangle that surrounds the display device that supports the largest color or grayscale palette. If more than one device supports the same pixel depth, the function returns information about the device that has the highest resolution.
  3215. Note that the function subtracts the menu bar from the returned rectangle if the best device is also the main display device.
  3216. The standard image-compression dialog component uses this function to position rectangles and dialog boxes when you indicate that the component is to choose the best display device. In general, your application does not need to use this function. 
  3217. RESULT CODEparamErr    –50    Invalid parameter specified    
  3218.  
  3219. Utility Function
  3220.  
  3221. The standard dialog component provides a single utility function that you can use to create a graphics world that is appropriate for the current compression settings. This function is described next.
  3222. SCNewGWorld
  3223.  
  3224. The SCNewGWorld function creates a graphics world based on the current compression settings.
  3225. pascal ComponentResult SCNewGWorld (ComponentInstance ci,
  3226.                                                      GWorldPtr *gwp, Rect *rp, 
  3227.                                                      GWorldFlags flags);
  3228. ci    Identifies your application’s connection to a standard image-compression dialog component.
  3229. gwp    Contains a pointer to a pointer to a graphics world. The standard dialog component places a pointer to the new graphics world into the field referred to by this parameter. If the component cannot create the graphics world, it sets this field to nil.
  3230.     Your application is responsible for disposing of the graphics world 
  3231. when you are done with it.
  3232. rp    Contains a pointer to the boundaries of the graphics world. If you set this parameter to nil, the standard dialog component uses the test image’s boundary rectangle. If you don’t specify a boundary rectangle and there is no test image, the component does not create the graphics world.
  3233. flags    Contains flags that are passed to QuickDraw’s NewGWorld function. See the chapter “Basic QuickDraw” in Inside Macintosh: Imaging for more information about this function.
  3234. DESCRIPTION
  3235. The SCNewGWorld function creates a graphics world that can accommodate the current compression settings, including color table and grayscale settings (if appropriate). If the selected color table is inappropriate for the pixel depth, the standard dialog component uses a standard color for the depth.
  3236. RESULT CODEscTypeNotFoundErr    –8971    Component cannot create a graphics world    
  3237.  
  3238. Application-Defined Function
  3239.  
  3240. The standard image-compression dialog component supplied by Apple allows you to extend the interface of the standard dialog box by defining a hook function. This section describes how that hook function operates.
  3241. MyHook
  3242.  
  3243. This function is called by the standard dialog component whenever the user selects an item in the standard image-compression dialog box. You define the function in your application and assign it to a dialog box with the hookProc field of the scExtendedProcsType request, which is discussed on page 3-21.
  3244. This is how you would define a hook function called MyHook:
  3245. pascal short MyHook (DialogPtr theDialog, short itemHit,
  3246.                             void *params, long refcon);
  3247. theDialog    Contains a pointer to the dialog structure that identifies the current 
  3248. dialog box.
  3249. itemHit    Identifies the item clicked by the user. 
  3250. params    Contains a pointer to a field that contains the identifier for your connection to the standard dialog component. You can use this identifier to call the dialog component’s SCGetInfo or SCSetInfo functions. 
  3251. refcon    Contains the reference constant value you supplied to the SCGetCompressionExtended function.
  3252. DESCRIPTION
  3253. Your hook function returns a short integer that identifies the item selected by the user. In general, your hook function should return the same item number it receives in the itemHit parameter. By returning a specific value, you can affect how the component handles the user selection. The following values are defined:
  3254. scOKItem    Indicates that the user clicked the OK button.
  3255. scCancelItem
  3256. Indicates that the user clicked the Cancel button.
  3257. scCustomItem
  3258. Indicates that the user clicked the custom button.
  3259. If you set the returned value to 0, you cancel the user selection; the dialog box remains on the screen awaiting further action by the user.
  3260. The hook function allows your application to tailor or extend the operation of the standard image-compression dialog box. By attaching your hook function to the dialog box, you intercept all user selections. For example, your hook function could perform additional parameter checking whenever the user clicks the OK button. In this case, whenever you detect an incorrect parameter value, you could display a message to the user and then set the returned value to 0, thereby canceling the user’s selection. The user would then either cancel the dialog box or try again.
  3261. As another example, you could support additional parameters by implementing 
  3262. the dialog box’s custom button. You could use your hook function to display a secondary dialog box whenever the user clicks the custom button. For an example of defining and using a custom button, see “Extending the Basic Dialog Box” beginning on page 3-11. 
  3263.  
  3264.  
  3265. Summary of Standard Image-Compression Dialog Components
  3266.  
  3267. C Summary
  3268.  
  3269. Constants
  3270.  
  3271. /* component type value */
  3272. #define            StandardCompressionType                                    'scdi'         /* standard image-compression
  3273.                                                              dialog component type */
  3274. #define            StandardCompressionSubType                                    'imag'     /* standard image-compression
  3275.                                                               dialog component subtype */
  3276. /* preference flags */
  3277. #define            scListEveryCodec                                    (1L<<1)                /* list all components */
  3278. #define            scAllowZeroFrameRate                                    (1L<<2)                /* allow 0 frame rate */
  3279. #define            scAllowZeroKeyFrameRate                                    (1L<<3)                /* allow 0 key frame rate */
  3280. #define            scShowBestDepth                                    (1L<<4)                /* allow "best depth" */
  3281. #define            scUseMovableModal                                    (1L<<5)                /* use movable dialog */
  3282.  
  3283. /* values for testFlags parameter of functions that set test image */
  3284. #define            scPreferCropping                                    (1<<0)                    /* crop image to fit */
  3285. #define            scPreferScaling                                    (1<<1)                    /* shrink image to fit */
  3286. #define             scPreferScalingAndCropping                                    (scPreferScaling + scPreferCropping)
  3287.                                                                     /* shrink then crop */
  3288.  
  3289. /* dimensions of the test image portion of the dialog box */
  3290. #define            scTestImageWidth                                    80        /* test width of image */
  3291. #define            scTestImageHeight                                    80        /* test height of image */
  3292.  
  3293. /* possible items returned by hook function */
  3294. #define            scOKItem                                    1        /* user clicked OK */
  3295. #define            scCancelItem                                    2        /* user clicked Cancel */
  3296. #define            scCustomItem                                    3        /* user clicked custom button */
  3297.  
  3298. /* result returned when user canceled */
  3299. #define            scUserCancelled                                    1        /* user canceled dialog */
  3300. /* selectors for standard image-compression dialog components */
  3301. #define            scPositionRect                                    2        /* SCPositionRect */
  3302. #define            scPositionDialog                                    3        /* SCPositionDialog */
  3303. #define            scSetTestImagePictHandle                                    4        /* SCSetTestImagePictHandle */
  3304. #define            scSetTestImagePictFile                                    5        /* SCSetTestImagePictFile */
  3305. #define            scSetTestImagePixMap                                    6        /* SCSetTestImagePixMap */
  3306. #define            scGetBestDeviceRect                                    7        /* SCGetBestDeviceRect */
  3307. #define            scRequestImageSettings                                    10        /* SCRequestImageSettings */
  3308. #define            scCompressImage                                    11        /* SCCompressImage */
  3309. #define            scCompressPicture                                    12        /* SCCompressPicture */
  3310. #define            scCompressPictureFile                                    13        /* SCCompressPictureFile */
  3311. #define            scRequestSequenceSettings                                    14        /* SCRequestSequenceSettings */
  3312. #define            scCompressSequenceBegin                                    15        /* SCCompressSequenceBegin */
  3313. #define            scCompressSequenceFrame                                    16        /* SCCompressSequenceFrame */
  3314. #define            scCompressSequenceEnd                                    17        /* SCCompressSequencEnd */
  3315. #define            scDefaultPictHandleSettings                                    18        /* SCDefaultPictHandleSettings */
  3316. #define            scDefaultPictFileSettings                                    19        /* SCDefaultPictFileSettings */
  3317. #define            scDefaultPixMapSettings                                    20        /* SCDefaultPixMapSettings */
  3318. #define            scGetInfo                                    21        /* SCGetInfo */
  3319. #define            scSetInfo                                    22        /* SCSetInfo */
  3320. #define            scNewGWorld                                    23        /* SCNewGWorld */
  3321.  
  3322. /* selectors included for compatibility with earlier linked version 
  3323.     of standard image-compression dialog component */
  3324. #define            scGetCompression                                1            /* SCGetCompression */
  3325. #define            scShowMotionSettings                                (1L<<0)            /* SCShowMotionSettings */
  3326. #define            scSettingsChangedItem                                -1            /* SCSettingsChangedItem */
  3327.  
  3328. /*    SCSetInfo and SCGetInfo request types */
  3329. #define            scSpatialSettingsType                                'sptl'            /* spatial options */
  3330. #define            scTemporalSettingsType                                'tprl'            /* temporal options */
  3331. #define            scDataRateSettingsType                                'drat'            /* data rate */
  3332. #define            scColorTableType                                'clut'            /* color table */
  3333. #define            scProgressProcType                                'prog'            /* progress function */
  3334. #define            scExtendedProcsType                                'xprc'            /* extended dialog */
  3335. #define            scPreferenceFlagsType                                'pref'            /* preferences */
  3336. #define            scSettingsStateType                                'ssta'            /* all settings */
  3337. #define            scSequenceIDType                                'sequ'            /* sequence ID */
  3338. #define            scWindowPositionType                                'wndw'            /* window position */
  3339. #define            scCodecFlagsType                                'cflg'            /* compression flags */
  3340. Data Types
  3341.  
  3342. /* SCModelFilterProcPtr is a pointer to a filter function */
  3343. typedef pascal Boolean (*SCModalFilterProcPtr) (DialogPtr theDialog,
  3344.                 EventRecord *theEvent, short *itemHit, long refcon);
  3345. /* SCModalHookProcPtr is a pointer to a hook function */
  3346. typedef pascal short (*SCModalHookProcPtr) (DialogPtr theDialog, 
  3347.                 short itemHit, SCParams *params, long refcon);
  3348. /*    spatial options structure with the spatial settings request */
  3349. typedef struct {
  3350.     CodecType                    codecType;                        /* compressor type */
  3351.     CodecComponent                    codec;                        /* compressor */
  3352.     short                    depth;                        /* pixel depth */
  3353.     CodecQ                    spatialQuality;                        /* desired quality */
  3354. } SCSpatialSettings;
  3355. /*    temporal options structure with the temporal settings request */
  3356. typedef struct {
  3357.     CodecQ            temporalQuality;                                    /* desired quality */
  3358.     Fixed            frameRate;                                    /* frame rate */
  3359.     long            keyFrameRate;                                    /* key frame rate */
  3360. } SCTemporalSettings;
  3361. /* data rate options with the data rate settings request */
  3362. typedef struct {
  3363.     long            dataRate;                                /* desired data rate */
  3364.     long            frameDuration;                                /* frame duration */
  3365.     CodecQ            minSpatialQuality;                                /* minimum value */
  3366.     CodecQ            minTemporalQuality;                                /* minimum value */
  3367. } SCDataRateSettings;
  3368. /* extending the dialog box with the extended functions request */
  3369. typedef struct {
  3370.     SCModalFilterProcPtr                                filterProc;                /* filter function */
  3371.     SCModalHookProcPtr                                hookProc;                /* hook function */
  3372.     long                                refcon;                /* reference constant */
  3373.     Str31                                customName;                /* custom button name */
  3374. } SCExtendedProcs;
  3375. /* standard compression parameter block for compatibility with earlier
  3376.     linked version of standard image-compression dialog components */
  3377. typedef struct {
  3378.     long                        flags;                        /* control flags */
  3379.     CodecType                        theCodecType;                        /* compressor type */
  3380.     CodecComponent                        theCodec;                        /* specific compressor */
  3381.     CodecQ                        spatialQuality;                        /* spatial quality value */
  3382.     CodecQ                        temporalQuality;                        /* temporal quality value */
  3383.     short                        depth;                        /* pixel depth */
  3384.     Fixed                        frameRate;                        /* desired frame rate */
  3385.     long                        keyFrameRate;                        /* desired key frame rate */
  3386.     long                        reserved1;                        /* reserved--set to 0) */
  3387.     long                        reserved2;                        /* reserved--set to 0 */
  3388. } SCParams;
  3389. Standard Image-Compression Dialog Component Functions
  3390.  
  3391. Getting Default Settings for an Image or a Sequence
  3392. pascal ComponentResult SCDefaultPixMapSettings
  3393. (ComponentInstance ci, PixMapHandle src, 
  3394. short motion);
  3395. pascal ComponentResult SCDefaultPictHandleSettings 
  3396. (ComponentInstance ci, PicHandle srcPicture, short motion);
  3397. pascal ComponentResult SCDefaultPictFileSettings
  3398. (ComponentInstance ci, short srcRef, 
  3399. short motion);
  3400. Displaying the Standard Image-Compression Dialog Box
  3401. pascal ComponentResult SCRequestImageSettings
  3402. (ComponentInstance ci);
  3403. pascal ComponentResult SCRequestSequenceSettings
  3404. (ComponentInstance ci);
  3405. Compressing Still Images
  3406. pascal ComponentResult SCCompressImage
  3407. (ComponentInstance ci, PixMapHandle src, 
  3408. Rect *srcRect, ImageDescriptionHandle *desc, Handle *data);
  3409. pascal ComponentResult SCCompressPicture
  3410. (ComponentInstance ci, PicHandle srcPicture, PicHandle dstPicture);
  3411. pascal ComponentResult SCCompressPictureFile
  3412. (ComponentInstance ci, short srcRefNum, 
  3413. short dstRefNum);
  3414. Compressing Image Sequences
  3415. pascal ComponentResult SCCompressSequenceBegin
  3416. (ComponentInstance ci, PixMapHandle src, 
  3417. Rect *srcRect, ImageDescriptionHandle *desc);
  3418. pascal ComponentResult SCCompressSequenceFrame
  3419. (ComponentInstance ci, PixMapHandle src, 
  3420. Rect *srcRect, Handle *data, long *dataSize, short *notSyncFlag);
  3421. pascal ComponentResult SCCompressSequenceEnd
  3422. (ComponentInstance ci);
  3423. Working With Image or Sequence Settings
  3424. pascal ComponentResult SCGetInfo
  3425. (ComponentInstance ci, OSType type, void *info);
  3426. pascal ComponentResult SCSetInfo
  3427. (ComponentInstance ci, OSType type, void *info);
  3428. Specifying a Test Image
  3429. pascal ComponentResult SCSetTestImagePictHandle 
  3430. (ComponentInstance ci, PicHandle testPict, Rect *testRect, short testFlags);
  3431. pascal ComponentResult SCSetTestImagePictFile 
  3432. (ComponentInstance ci, short testFileRef, Rect *testRect, short testFlags);
  3433. pascal ComponentResult SCSetTestImagePixMap 
  3434. (ComponentInstance ci, PixMapHandle testPixMap, Rect *testRect, short testFlags);
  3435. Positioning Dialog Boxes and Rectangles
  3436. pascal ComponentResult SCPositionRect 
  3437. (ComponentInstance ci, Rect *rp, Point *where);
  3438. pascal ComponentResult SCPositionDialog 
  3439. (ComponentInstance ci, short id, Point *where);
  3440. pascal ComponentResult SCGetBestDeviceRect 
  3441. (ComponentInstance ci, Rect *r);
  3442. Utility Function
  3443. pascal ComponentResult SCNewGWorld
  3444. (ComponentInstance ci, GWorldPtr *gwp, 
  3445. Rect *rp, GWorldFlags flags);
  3446. Application-Defined Function
  3447.  
  3448. pascal short MyHook     (DialogPtr theDialog, short itemHit, void *params, long refcon);
  3449. Pascal Summary
  3450.  
  3451. Constants
  3452.  
  3453. CONST
  3454.     {component type value}
  3455.     StandardCompressionType                                    =    'scdi';            {standard image-compression }
  3456.                                                         { dialog component type}
  3457.     StandardCompressionSubType     =                                    'imag';            {standard image-compression }
  3458.                                                         { dialog component subtype}
  3459.     {preference flags}
  3460.     scListEveryCodec                                = $2;            {list all components}
  3461.     scAllowZeroFrameRate                                 = $4;            {allow 0 frame rate}
  3462.     scAllowZeroKeyFrameRate                                 = $8;            {allow 0 key frame rate}
  3463.     scShowBestDepth                                 = $10;            {allow "best depth"}
  3464.     scUseMovableModal                                 = $20;            {use movable dialog box}
  3465.     {values for testFlags parameter of functions that set test image}
  3466.     scPreferCropping                                    = 1;        {crop image to fit}
  3467.     scPreferScaling                                     = 2;        {shrink image to fit}
  3468.     scPreferScalingAndCropping     = 3;                                        {shrink then crop}
  3469.     {dimensions of the test image portion of the dialog box}
  3470.     scTestImageWidth                             = 80;        {test width of image}
  3471.     scTestImageHeight                             = 80;        {test height of image}                    
  3472.     
  3473.     {possible items returned by hook function}
  3474.     scOKItem                     = 1;            {user clicked OK}
  3475.     scCancelItem                     = 2;            {user clicked Cancel}
  3476.     scCustomItem                     = 3;            {user clicked custom button}
  3477.  
  3478.     {result returned when user canceled}
  3479.     scUserCancelled                        =    1;    {user canceled dialog}
  3480.     {selectors for standard image-compression dialog components}
  3481.     kScPositionRect                                        =    2;        {SCPositionRect}
  3482.     kScPositionDialog                                        =    3;        {SCPositionDialog}
  3483.     kScSetTestImagePictHandle                                        =    4;        {SCSetTestImagePictHandle}
  3484.     kScSetTestImagePictFile                                        =    5;        {SCSetTestImagePictFile}
  3485.     kScSetTestImagePixMap                                        =    6;        {SCSetTestImagePixMap}
  3486.     kScGetBestDeviceRect                                        =    7;        {SCGetBestDeviceRect}
  3487.     kScRequestImageSettings                                        =    $A;        {SCRequestImageSettings}
  3488.     kScCompressImage                                        =    $B;        {SCCompressImage}
  3489.     kScCompressPicture                                        =    $C;        {SCCompressPicture}
  3490.     kScCompressPictureFile                                        =    $D;        {SCCompressPictureFile}
  3491.     kScRequestSequenceSettings                                        =    $E;        {SCRequestSequenceSettings}
  3492.     kScCompressSequenceBegin                                        =    $F;        {SCCompressSequenceBegin}
  3493.     kScCompressSequenceFrame                                        =    $10;        {SCCompressSequenceFrame}
  3494.     kScCompressSequenceEnd                                        =    $11;        {SCCompressSequenceEnd}
  3495.     kScDefaultPictHandleSettings                                        =    $12;        {SCDefaultPictHandleSettings}
  3496.     kScDefaultPictFileSettings                                        =    $13;        {SCDefaultPictFileSettings}
  3497.     kScDefaultPixMapSettings                                        =    $14;        {SCDefaultPixMapSettings}
  3498.     kScGetInfo                                        =    $15;        {SCGetInfo}
  3499.     kScSetInfo                                        =    $16;        {SCSetInfo}
  3500.     kScNewGWorld                                        =    $17;        {SCNewGWorld}
  3501.  
  3502.     {selectors included for compatibility with earlier linked version }
  3503.     { of standard image-compression dialog component}    
  3504.     kScShowMotionSettings                                         =    1;    {SCShowMotionSettings}
  3505.     kScGetCompression                                         =    1;    {SCGetCompression}
  3506.     kScSettingsChangedItem                                         = -1;        {SCSettingsChangedItem}
  3507.  
  3508.     {SCSetInfo and SCGetInfo request types}
  3509.     scSpatialSettingsType                                    =    'sptl';            {spatial options}    
  3510.     scTemporalSettingsType                                    =    'tprl';            {temporal options    }
  3511.     scDataRateSettingsType                                    =    'drat';            {data rate    }
  3512.     scColorTableType                                    =    'clut';            {color table}
  3513.     scProgressProcType                                    =    'prog';            {progress function}
  3514.     scExtendedProcsType                                    =    'xprc';            {extended dialog}
  3515.     scPreferenceFlagsType                                    =    'pref';            {preferences    }
  3516.     scSettingsStateType                                    =    'ssta';            {all settings}
  3517.     scSequenceIDType                                    =    'sequ';            {sequence ID}
  3518.     scWindowPositionType                                    =    'wndw';            {window position}
  3519.     scCodecFlagsType                                    =    'cflg';            {compression flags}
  3520. Data Types
  3521.  
  3522. TYPE
  3523.     {SCModelFilterProcPtr is a pointer to a filter function}
  3524.     SCModalFilterProcPtr = ProcPtr;
  3525.     {SCModalHookProcPtr is a pointer to a hook function}
  3526.     SCModalHookProcPtr = ProcPtr;
  3527.     {spatial options structure with the spatial settings request}
  3528.     SCSpatialSettings = 
  3529.     RECORD 
  3530.         cType:                         CodecType;                        {compressor type}
  3531.         codec:                         CodecComponent;                        {compressor}
  3532.         depth:                         Integer;                        {pixel depth}
  3533.         spatialQuality:                         CodecQ;                        {desired quality}
  3534.     END;
  3535.     {temporal options structure with the temporal settings request}
  3536.     SCTemporalSettings = 
  3537.     RECORD
  3538.         temporalQuality:                        CodecQ;                {desired quality}
  3539.         frameRate:                         Fixed;                {frame rate}
  3540.         keyFrameRate:                         LongInt;                {key frame rate}
  3541.     END;
  3542.     {data rate options with the data rate settings request}
  3543.     SCDataRateSettings = 
  3544.     RECORD 
  3545.         dataRate:                            LongInt;                {desired data rate}
  3546.         frameDuration:                            LongInt;                {frame duration}
  3547.         minSpatialQuality    :                        CodecQ;                {minimum value}
  3548.         minTemporalQuality    :                        CodecQ;                {minimum value}
  3549.     END;
  3550.     {extending the dialog box with the extended functions request}
  3551.     SCExtendedProcs = 
  3552.     RECORD 
  3553.         filterProc:                    SCModalFilterProcPtr;                            {filter function}
  3554.         hookProc    :                SCModalHookProcPtr;                            {hook function}
  3555.         refCon        :            LongInt;                            {reference constant}
  3556.         customName:                    Str31;                            {custom button name}
  3557.     END; 
  3558.     {standard compression parameter block included for compatibility }
  3559.     { with earlier linked version of standard-image compression dialog }
  3560.     { component}
  3561.     SCParams = 
  3562.     RECORD
  3563.         flags        :                LongInt;                        {control flags}
  3564.         theCodecType:                        CodecType;                        {compressor type}
  3565.         theCodec    :                    CodecComponent;                        {specific compressor}
  3566.         spatialQuality:                         CodecQ;                        {spatial quality value}
  3567.         temporalQuality:                         CodecQ;                        {temporal quality value}
  3568.         depth:                         Integer;                        {pixel depth}
  3569.         frameRate:                         Fixed;                        {desired frame rate}
  3570.         keyFrameRate    :                     LongInt;                        {desired key frame rate}
  3571.         reserved1:                         LongInt;                        {reserved--set to 0}
  3572.         reserved2        :                LongInt;                        [reserved--set to 0}
  3573.     END;
  3574. Standard Image-Compression Dialog Component Routines
  3575.  
  3576. Getting Default Settings for an Image or a Sequence
  3577. FUNCTION SCDefaultPixMapSettings
  3578. (ci: ComponentInstance; src: PixMapHandle;
  3579. motion: Boolean): ComponentResult;
  3580. FUNCTION SCDefaultPictHandleSettings
  3581. (ci: ComponentInstance; src: PicHandle; 
  3582. motion: Boolean): ComponentResult;
  3583. FUNCTION SCDefaultPictFileSettings
  3584. (ci: ComponentInstance; srcRef: Integer; motion: Boolean): ComponentResult;
  3585. Displaying the Standard Image-Compression Dialog Box
  3586. FUNCTION SCRequestImageSettings            
  3587. (ci: ComponentInstance): ComponentResult;
  3588. FUNCTION SCRequestSequenceSettings    
  3589. (ci: ComponentInstance): ComponentResult;
  3590. Compressing Still Images
  3591. FUNCTION SCCompressImage     (ci: ComponentInstance; src: PixMapHandle; 
  3592. srcRect: Rect; 
  3593. VAR desc: ImageDescriptionHandle; 
  3594. VAR data: Handle): ComponentResult;
  3595. FUNCTION SCCompressPicture    (ci: ComponentInstance; src, dst: PicHandle): ComponentResult;
  3596. FUNCTION SCCompressPictureFile
  3597. (ci: ComponentInstance; srcRef, 
  3598. dstRef: Integer): ComponentResult;
  3599. Compressing Image Sequences
  3600. FUNCTION SCCompressSequenceBegin
  3601. (ci: ComponentInstance; src: PixMapHandle; srcRect: Rect; 
  3602. VAR desc: ImageDescriptionHandle): ComponentResult;
  3603. FUNCTION SCCompressSequenceFrame
  3604. (ci: ComponentInstance; src: PixMapHandle; srcRect: Rect; VAR data: Handle; 
  3605. VAR dataSize: LongInt; 
  3606. VAR notSyncFlag: Boolean): ComponentResult;
  3607. FUNCTION SCCompressSequenceEnd    
  3608. (ci: ComponentInstance): ComponentResult;
  3609. Working With Image or Sequence Settings
  3610. FUNCTION SCGetInfo    (ci: ComponentInstance; infoType: OSType; 
  3611. info: Ptr): ComponentResult;
  3612. FUNCTION SCSetInfo    (ci: ComponentInstance; infoType: OSType; 
  3613. info: Ptr): ComponentResult;
  3614. Specifying a Test Image
  3615. FUNCTION SCSetTestImagePictHandle 
  3616. (ci: ComponentInstance; testPict: PicHandle; testRect: RectPtr; testFlags: Integer): ComponentResult;
  3617. FUNCTION SCSetTestImagePictFile
  3618. (ci: ComponentInstance; testFileRef: Integer; testRect: RectPtr; testFlags: Integer): ComponentResult;
  3619. FUNCTION SCSetTestImagePixMap
  3620. (ci: ComponentInstance; 
  3621. testPixMap: PixMapHandle; testRect: RectPtr; 
  3622. testFlags: Integer): ComponentResult;
  3623. Positioning Dialog Boxes and Rectangles
  3624. FUNCTION SCPositionRect    (ci: ComponentInstance; r: RectPtr;
  3625. VAR where: Point): ComponentResult;
  3626. FUNCTION SCPositionDialog    (ci: ComponentInstance; id: Integer; 
  3627. VAR where: Point): ComponentResult;
  3628. FUNCTION SCGetBestDeviceRect
  3629. (ci: ComponentInstance; r: RectPtr):
  3630. ComponentResult;
  3631. Utility Function
  3632. FUNCTION SCNewGWorld    (ci: ComponentInstance; VAR gwp: GWorldPtr; 
  3633. VAR rp: Rect; flags: GWorldFlags):
  3634. ComponentResult;
  3635. Application-Defined Routine
  3636.  
  3637. FUNCTION MyHook    (theDialog: DialogPtr; itemHit: Integer; 
  3638. params Ptr; refcon: LongInt): Integer;
  3639. Result CodesscTypeNotFoundErr    –8971    Component does not have the information you want    
  3640.  
  3641. Listing 4-0
  3642. Table 4-0
  3643. Image Compressor Components
  3644. Contents
  3645. About Image Compressor Components4-3
  3646. Banding and Extending Images4-4
  3647. Spooling of Compressed Data4-6
  3648. Data Loading4-6
  3649. Data Unloading4-7
  3650. Compressing or Decompressing Images Asynchronously4-8
  3651. Progress Functions4-9
  3652. Using Image Compressor Components4-10
  3653. Performing Image Compression4-10
  3654. Choosing a Compressor4-10
  3655. Compressing a Horizontal Band of an Image4-13
  3656. Decompressing an Image4-16
  3657. Choosing a Decompressor4-17
  3658. Decompressing a Horizontal Band of an Image4-21
  3659. Image Compressor Components Reference4-26
  3660. Constants4-26
  3661. Image Compressor Component Capabilities4-26
  3662. Format of Compressed Data and Files4-32
  3663. Data Types4-35
  3664. The Compressor Capability Structure4-35
  3665. The Compression Parameters Structure4-40
  3666. The Decompression Parameters Structure4-46
  3667. Functions4-53
  3668. Direct Functions4-54
  3669. Indirect Functions4-62
  3670. Image Compression Manager Utility Functions4-65
  3671. Summary of Image Compressor Components4-69
  3672. C Summary4-69
  3673. Constants4-69
  3674. Data Types4-72
  3675. Functions4-76
  3676. Image Compression Manager Utility Functions4-77
  3677. Pascal Summary4-77
  3678. Constants4-77
  3679. Data Types4-80
  3680. Routines4-83
  3681. Image Compression Manager Utility Functions4-84
  3682. Result Codes4-84
  3683. Image Compressor Components
  3684. This chapter discusses the attributes of image compressor components and the functional interfaces these components must support. An image compressor component is a code resource that provides compression or decompression services for image data. Throughout this chapter, the term image compressor component is used to describe both compressor and decompressor components. 
  3685. Note
  3686. The information in this chapter is intended for developers of image compressor components. Application developers normally do not need to be familiar with this material to use the Image Compression Manager.u
  3687. This chapter has been divided into the following sections:
  3688. n    “About Image Compressor Components” presents general information about image compressor components.
  3689. n    “Using Image Compressor Components” discusses how the Image Compression Manager uses image compressor components to compress and decompress images.
  3690. n    “Image Compressor Components Reference” describes the data structures used by the Image Compression Manager to communicate with image compressor components. It also provides a comprehensive reference to the functions that your image compressor component must support.
  3691. n    “Summary of Image Compressor Components” presents a summary of image compressor components in C and in Pascal.
  3692. If you are developing an image compressor component, you should read all the material in this chapter. In addition, you should read the appropriate sections of the chapter “Component Manager” in Inside Macintosh: More Macintosh Toolbox.
  3693.  
  3694. About Image Compressor Components
  3695.  
  3696. Image compressor components are registered by the Component Manager, and they present a standard interface to the Image Compression Manager (see “Functions” beginning on page 4-53 for a detailed description of the functions that image compressor components must provide). An image compressor component can be a systemwide resource, or it can be local to a particular application.
  3697. Applications never communicate directly with these components. Applications request compression and decompression services by issuing the appropriate Image Compression Manager functions. The Image Compression Manager then performs its necessary processing before invoking the component. Of course, an application could install its own image compressor component. However, any interaction between the application and the component is still managed by the Image Compression Manager.
  3698. The Image Compression Manager knows about two types of image compressor components. Components that can compress image data carry a component type of 'imco' and are called image compressors. Components that can decompress images have a component type of 'imdc' and are called image decompressors.
  3699. #define compressorComponentType 'imco'                                                        /* compressor component
  3700.                                                             type */
  3701. #define decompressorComponentType 'imdc'                                                        /* decompressor
  3702.                                                              component type */
  3703. The value of the component subtype indicates the compression algorithm supported by the component. For example, the graphics compressor has the component subtype 'cvid'. (A component subtype is an element in the classification hierarchy used by 
  3704. the Component Manager to define the services provided by a component.) All compressor components with the same subtype must be able to handle the same format of compressed data. During decompression, a component should handle all variations of the data specified for a subtype. While compressing an image, a compressor must not produce data that decompressors of the same subtype cannot handle during decompression.
  3705. The Image Compression Manager provides a set of utility functions for compressor components. These functions allow compressors and decompressors to create custom color lookup tables, among other things. For a complete description of these utility functions, along with the functions that must be supported by compressor components, see “Image Compression Manager Utility Functions,” which begins on page 4-65.
  3706. The Image Compression Manager defines four callback functions that may be provided to compressors and decompressors by applications. These callback functions are data-loading functions, data-unloading functions, completion functions, and progress functions. Data-loading functions and data-unloading functions support spooling of compressed data. Completion functions allow components to report that asynchronous operations have completed. Progress functions provide a mechanism for components to report their progress toward completing an operation. For more information about these callback functions, see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime.
  3707. Banding and Extending Images
  3708.  
  3709. QuickTime handles images in bands, which are horizontal strips of an image. Bands allow large images to be accommodated even if the entire image cannot fit into memory. The Image Compression Manager calls the image compressor component once for each band as the image is compressed or decompressed. 
  3710. The Image Compression Manager determines the height of a band based on the amount of available memory and the bandMin and bandInc parameters provided by 
  3711. the compressor component in the compressor capability structure (described in “The Compressor Capability Structure” beginning on page 4-35). The bandMin field specifies the minimum band height supported by a decompressor component. By providing a minimum height, decompressor components that operate on blocks of pixels can operate more efficiently since the minimum height ensures that a band has at least one row of pixel blocks. The bandInc field specifies the increment in pixels by which the height of a band is increased above the minimum when sufficient memory is available. This specification allows easier processing by ensuring that a band is an integral number of rows of blocks. The larger these two parameters, the more memory is required for the band buffer, which may limit the size of images used with a given amount of memory. By specifying a minimum height that is the size of the image, the compressor component can indicate that it cannot handle banded images. However, the specification of a full size is not recommended unless required by the compression format, since it requires large amounts of memory for large images.
  3712. For decompressing sequences of images with temporal compression, the Image Compression Manager always allocates the band to include the full image. The entire image must be available whenever the screen needs updating and the current frame does not have information for all pixels. The entire image is needed to make the comparison with the previous frame.
  3713. The depth of the band is determined by the Image Compression Manager and the wantedPixelSize field of the compressor capability structure (described on page 4-35). That field is filled in by the image compressor component’s CDPreCompress or CDPreDecompress function (described on page 4-62 and page 4-63, respectively). The Image Compression Manager requests the depth that it decides is best for the image, and the compressor component can return the wantedPixelSize field set to that depth or another appropriate depth if the compressor cannot handle the one requested.
  3714. The width of the band is usually the width of the image, but the compressor can 
  3715. extend the measurement if it cannot easily handle partial blocks of pixels at the edge of the image. For compression operations, the Image Compression Manager sets the extra pixels added to the right edge of the band to the same value as the last pixel in each scan line. For decompression operations, the Image Compression Manager ignores the pixels that were added to the right edge for the extension. 
  3716. Image compressor components can also use extension for the height of the last (or the only) band in the image (the other bands should always be an integral multiple of the bandInc field set by the decompressor component). The extended pixels are added to the bottom of the band. For compression operations, the added pixels have the same value as the pixel at the same location in the last scan line of the image. For decompression operations, the added pixels are ignored. If an image compressor component does not want to deal with partial blocks of pixels, either horizontally or vertically, it can use this extension technique. However, it would be more efficient for the compressor to handle those blocks itself.
  3717. Spooling of Compressed Data
  3718.  
  3719. If available memory is insufficient to hold the entire image that is being compressed or decompressed, the image compressor component must call data-loading or data-unloading functions to spool—that is, read or write the data from storage in stages. The calling application indicates this in the data-loading or data-unloading structure, as described in the following sections.
  3720. Data Loading
  3721.  
  3722. Decompressor components use data loading. The data buffer still exists when the calling application supplies a data-loading function; however, the data buffer holds only part of the data and you must use the data-loading function to load the remaining data into this buffer. The bufferSize parameter of the decompression parameters structure (described on page 4-46) indicates the size of the data buffer.
  3723. To use the data-loading function, the decompressor component calls it with the 
  3724. pointer to the current position in the data buffer as a parameter. The decompressor specifies the number of bytes it needs (this number must be less than or equal to the size of the data buffer). The data-loading function fills in the data buffer with the number of bytes requested and may adjust the pointer as necessary to remove some of the used data and make room for new data. 
  3725. If the decompressor component needs to skip data in the compressed stream or go back to data earlier in the stream, the decompressor should call the data-loading function with a nil pointer (instead of the pointer to the data buffer of the data-loading function) and with the size parameter set to the number of bytes that the decompressor wants to skip relative to the current position in the stream. A positive number seeks forward and a negative one seeks backward. To ensure that the position in the stream is known by the data-loading function, the decompressor should call the function before specifying a seek operation with an actual pointer to the current position in the data buffer and a 0 byte count. After the seek operation, the decompressor component should call the data-loading function again with the number of bytes needed from the new position to make sure the needed bytes are read into the buffer.
  3726. A decompressor component should not depend on the ability to skip backward in the data stream since not all applications are able to take advantage of this feature. The decompressor should check the error from the data-loading function during a seek operation and should not use the seek feature if an error code is returned. Seeking forward works in most situations; however, it may entail reading the data and throwing it out. Hence, seeking forward may not always be faster than reading the data.
  3727. Figure 4-1 shows several image bands and their measurements.
  3728. Figure 4-1    Image bands and their measurements
  3729.  
  3730. Data Unloading
  3731.  
  3732. Data-unloading functions are used by compressor components when there is insufficient memory to hold the buffer for the compressed data produced by the compressor component. The compressor component needs to use a data-unloading function if the flushProcRecord field in the compression parameters structure is not nil. (For details on the compression parameters structure, see page 4-40). A data buffer is provided even if the data-unloading function is present, and it should be used to hold the data to be unloaded by the data-unloading function. The size of the data buffer is indicated by the bufferSize field in the parameters. 
  3733. To use the data-unloading function, the compressor fills the data buffer with as much data as possible (within the size limitations of the data buffer). The compressor component then calls the data-unloading function with a pointer to the start of the data buffer and the number of bytes written. The data-unloading function then unloads the data from the buffer. The compressor should then use the entire buffer for the next piece of data—and continue in this manner until all the data is unloaded.
  3734. If the compressor component needs to skip forward or backward in the data stream, 
  3735. it should call the data-unloading function with a nil data pointer, and the compressor should specify the number of bytes to seek relative to the current position in the size parameter. A positive number seeks forward and a negative one seeks backward. The compressor component should make sure that all data is unloaded from the buffer before commencing the seek operation. After the seek operation, the next data unloaded from the buffer with the data-unloading function is written starting at the new location. The new data overwrites any data previously written at that location in the data stream.
  3736. Not all applications support the ability to seek forward or backward with a 
  3737. data-unloading function. The compressor component should check the error result when performing such an operation.
  3738. Compressing or Decompressing Images Asynchronously
  3739.  
  3740. With the appropriate hardware, image compressor components can handle asynchronous compression and decompression of images using the CDBandCompress and CDBandDecompress functions, which are described on page 4-63 and page 4-64, respectively. Asynchronous refers to the fact that the compression or decompression hardware performs its operations while the Macintosh computer simultaneously continues its activities. For example, the Macintosh can read a movie for the next frame while the current frame is decompressed. The Image Compression Manager ensures that any asynchronous operation in progress is completed before starting the next operation.
  3741. If the Image Compression Manager wants the image compressor component to perform an operation asynchronously, then the completionProcRecord field in the compression or decompression parameters structure that the Image Compressor Manager sends to the image compressor component should be set to a nonzero value. If the value is –1, then the component should perform the operation asynchronously, but it does not need to call a completion function. If the value is not nil and not –1, then the component should perform the operation asynchronously, and it should call the completion function when the operation is done. For details on the compression parameters structure, see page 4-40. For more on the decompression parameters structure, see page 4-46.
  3742. To provide synchronization for the Image Compression Manager, an image compressor component provides the CDCodecBusy function (described on page 4-61). CDCodecBusy should always return 1 if an asynchronous operation is in progress; it should return 0 if there is no asynchronous operation in progress or if the image compressor component does not perform asynchronous operations. If the 
  3743. Image Compression Manager provided a completion function, the image compressor component must call the completion function as well.
  3744. IMPORTANT
  3745. IMPORTANT
  3746. If the Image Compression Manager provided a completion function, then the compressor component must call it; otherwise, the memory for that operation may become increasingly stranded in the system and difficult to deallocate.s
  3747. There are two distinct steps to an asynchronous compression or decompression operation. The first step depends on the source data, and the second step depends on the destination data. 
  3748. n    For a compression operation, the first step indicates when the compressor is finished with the pixels of the source image, and the second step specifies that the compressed data is fully written to memory. 
  3749. n    For a decompression operation, the first step is complete when the compressed data is read into the hardware or the decompressor’s local buffers, and the second step is complete when all the pixels of the image have been written to the destination. 
  3750. Depending on the design of the hardware used by your image compressor component, the two steps in the asynchronous operations may be independent of each other or tied together. To indicate to the completion function which steps have been completed, you use the codecCompletionSource and CodecCompletionDest flags for the first and second steps, respectively. If both parts of the asynchronous operation are completed together, the image compressor component can call the completion function once with both flags set. The memory used for each part of the operation remains valid and locked while asynchronous operations are in progress. It is the responsibility of image compressor components to make sure that they remain resident in RAM if virtual memory is active (this is only an issue for hardware image compressor components that perform direct memory access).
  3751. Progress Functions
  3752.  
  3753. Progress functions provide the calling application an indication of how much of an operation is complete and a way for the user to cancel an operation. If the progressProcRecord field is set either in the compression parameters structure or the decompression parameters structure, then the image compressor component should call the progress function as it performs the operation. The progress function is typically called once for each scan line or row of pixel blocks processed, and it returns a completion value that is the percentage of the band that is complete, represented as a fixed-point number from 0 to 1.0. 
  3754. If the result returned from a progress function is not 0, then the image compressor component should return as soon as possible (without completing the band that is being processed) with a return value of codecAbortErr.
  3755. Note
  3756. For efficiency, many image compressor components have a streamlined path used for cases that do not require data-loading, data-unloading, or progress functions, and a slower path that supports any or all these application-defined functions when required.u
  3757.  
  3758.  
  3759. Using Image Compressor Components
  3760.  
  3761. This section shows how to use compressors and decompressors in conjunction with the Image Compression Manager.
  3762. Performing Image Compression
  3763.  
  3764. This section describes what the Image Compression Manager does that affects compressors. It then provides sample code that shows how the compressor components prepare for image compression and how to compress an entire image or a horizontal band of an image.
  3765. When compressing an image, the Image Compression Manager performs three 
  3766. major tasks:
  3767.     1.    The Image Compression Manager first determines which compressor is best able to compress the image. To do so, the Image Compression Manager examines the source image as well as the parameters specified by the application. If the application requested a specific compressor, the Image Compression Manager uses that compressor (unless it is not installed, in which case the Image Compression 
  3768. Manager returns an error to the application). If the application did not request a compressor, the Image Compression Manager chooses the compressor that will do the best job. The Image Compression Manager collects the information it needs to choose a compressor by issuing the CDPreCompress request to each qualifying compressor (see page 4-62 for a detailed description of the CDPreCompress function).
  3769.     2.    If the chosen compressor can handle the image directly, the Image Compression Manager passes the request through to the compressor. The compressor then processes the image and returns the compressed data to the specified location.
  3770.     3.    If none of the compressors can handle it directly, the Image Compression Manager allocates an offscreen buffer and passes image bands to the compressor by issuing a CDBandCompress request. (For more on the CDBandCompress function, see page 4-63.) The compressor processes each band, accumulating the compressed data as it goes. When the image has been completely compressed, the Image Compression Manager returns control to the application.
  3771. Choosing a Compressor
  3772.  
  3773. Listing 4-1 on page 4-12 shows how the Image Compression Manager calls the CDPreCompress function before an image is compressed. The compressor component returns information about how it is able to compress the image to the Image Compression Manager, so that it can fit the destination data to the requirements of 
  3774. the compressor component. This information includes compressor capabilities for 
  3775. n    depth of input pixels
  3776. n    minimum buffer band size
  3777. n    band increment size
  3778. n    extension width and height
  3779. When your compressor component is called with the CDPreCompress function (described on page 4-62), it can handle all aspects of the function itself, or only the most common ones. All image compressor components must handle at least one case. 
  3780. Here is a list of some of the operations your compressor component can perform during compression. It describes parameters in the compression parameters structure (described on page 4-40) and indicates the operations that are required and which flags in the compressor capabilities flags field of the compressor capabilities structure (described on page 4-35) must be set to allow your compressor to handle them.
  3781. n    Depth conversion. If your compressor component can compress from the pixel depth indicated by the pixelSize field (in the pixel map structure pointed to by the srcPixmap field of the compression parameters structure), it should set the wantedPixelSize field of the compressor capability structure to the same value. If it cannot handle that depth, it should specify the closest depth it can support in the wantedPixelSize field. The Image Compression Manager will convert the source image to that depth.
  3782. n    Extension. If the format for the compressed data is block oriented, the compressor component can request that the Image Compression Manager allocate a buffer that is a multiple of the proper block size by setting the extendWidth and extendHeight parameters of the compressor capability structure. The new pixels are replicated from the left and bottom edges to fill the extended area. If your compressor can perform this extension itself, it should leave the extendWidth and extendHeight fields set to 0. In this case, the Image Compression Manager can avoid copying the source image to attain more efficient operation.
  3783. n    Pixel shifting. For pixel sizes less than 8 bits per pixel, it may be necessary to shift the source pixels so that they are at an aligned address. If the pixelSize field of the source pixel map structure is less than 8, and your compressor component handles that depth directly, and the left address of the image (srcRect.left – srcPixMap.bounds.left) is not aligned and your compressor component can handle these pixels directly, then it should set the codecCanShift flag in the flags field of the compressor capabilities structure. If your compressor component does not set this flag, then the data will be copied to a buffer with the image shifted so the first pixel is in the most significant bit of an aligned long-word address.
  3784. n    Updating previous pixel maps. Compressors that perform temporal compression may keep their own copy of the previous frame’s pixel map, or they may update the previous frame’s pixel map as they perform the compression. In these cases, the compressor component should set the codecCanCopyPrev flag if it updates the previous pixel map with the original data from the current frame, or it should set the codecCanCopyPrevComp flag if it updates the previous pixel map with a compressed copy of the current frame.
  3785. Listing 4-1    Preparing for simple compression operations
  3786.  
  3787. pascal long
  3788. CDPreCompress (Handle storage, register CodecCompressParams *p)
  3789. {
  3790.     CodecCapabilities *capabilities = p->capabilities;
  3791. /* 
  3792.     First the compressor returns which depth input pixels it
  3793.     supports based on what the application has available. This
  3794.     compressor can only work with 32-bit input pixels. 
  3795. */       
  3796.     switch ( (*p->imageDescription)->depth )  {
  3797.         case 16:
  3798.             capabilities->wantedPixelSize = 32;
  3799.             break;
  3800.         default:
  3801.             return(codecConditionErr);
  3802.             break;
  3803.     }
  3804.     /* 
  3805.         If the buffer gets banded, return the smallest one the 
  3806.         compressor can handle. 
  3807.     */    
  3808.     capabilities->bandMin = 2;
  3809.     /* 
  3810.         If the buffer gets banded, return the increment 
  3811.         by which it should increase. 
  3812.     */
  3813.     capabilities->bandInc = 2;
  3814.         
  3815.     capabilities->extendWidth = (*p->imageDescription)->width & 1;
  3816.     capabilities->extendHeight = (*p->imageDescription)->height &
  3817.                                              1;
  3818.  
  3819. /* 
  3820.     For efficiency, if the compressor could perform extension,
  3821.     these flags would be set to 0. 
  3822. */
  3823.     
  3824.     return(noErr);
  3825. }
  3826. Compressing a Horizontal Band of an Image
  3827.  
  3828. Listing 4-2 shows how the Image Compression Manager calls the CDBandCompress function when it wants the compressor to compress a horizontal band of an image. 
  3829. Note
  3830. This example does not perform compression on bands with a bit depth of more than 1 or an extension of width and height. If the example did do so, it would handle these cases faster.u
  3831. Listing 4-2    Performing simple compression on a horizontal band of an image
  3832.  
  3833. pascal long
  3834. CDBandCompress (Handle storage, register CodecCompressParams *p)
  3835. {
  3836.     short                        width,height;
  3837.     Ptr                        cDataPtr,dataStart;
  3838.     short                        depth;
  3839.     Rect                        sRect;
  3840.     long                        offsetH,offsetV;
  3841.     Globals                        **glob  = (Globals **)storage;
  3842.     register char                         *baseAddr;
  3843.     long                        numLines,numStrips;
  3844.     short                        rowBytes;
  3845.     long                        stripBytes;
  3846.     char                        mmuMode = 1;
  3847.     register short                        y;
  3848.     ImageDescription                        **desc = p->imageDescription;
  3849.     OSErr                        result = noErr;
  3850.     
  3851.     /* 
  3852.     If there is a progress function, give it an open call at
  3853.         the start of this band. 
  3854.     */
  3855.     if (p->progressProcRecord.progressProc)
  3856.         p->progressProcRecord.progressProc (codecProgressOpen, 0,
  3857.             p->progressProcRecord.progressRefCon);
  3858.  
  3859.     width = (*desc)->width;
  3860.     height = (*desc)->height;
  3861.     depth = (*desc)->depth;
  3862.     dataStart = cDataPtr = p->data;
  3863.  
  3864.     /* 
  3865.         Figure out offset to first pixel in baseAddr from the
  3866.         pixel size and bounds.
  3867.      */
  3868.  
  3869.     rowBytes = p->srcPixMap.rowBytes;
  3870.     sRect =  p->srcPixMap.bounds;
  3871.     numLines = p->stopLine - p->startLine;                                                    /* number of scan 
  3872.                                                              lines */
  3873.     numStrips = (numLines+1)>>1;                                                    /* number of strips 
  3874.                                                             in */
  3875.     stripBytes = ((width+1)>>1) * 5;
  3876.     
  3877.     /* 
  3878.         Adjust the source baseAddress to be at the beginning 
  3879.         of the desired rect. 
  3880.     */
  3881.  
  3882.     switch ( p->srcPixMap.pixelSize ) {
  3883.     case 32:
  3884.         offsetH = sRect.left<<2;
  3885.         break;
  3886.     case 16:
  3887.         offsetH = sRect.left<<1;
  3888.         break;
  3889.     case 8:
  3890.         offsetH = sRect.left;
  3891.         break;
  3892.  
  3893.     /* 
  3894.         This compressor does not handle the other cases directly. 
  3895.     */
  3896.  
  3897.     default:
  3898.         result = codecErr;
  3899.         goto bail;
  3900.     }
  3901.  
  3902.     offsetV = sRect.top * rowBytes;
  3903.     baseAddr = p->srcPixMap.baseAddr + offsetH + offsetV;
  3904.  
  3905.     /* 
  3906.         If there is not a data-unloading function, 
  3907.         adjust the pointer to the next band. 
  3908.     */
  3909.     
  3910.     if (  p->flushProcRecord.flushProc == nil ) {
  3911.         cDataPtr += (p->startLine>>1) * stripBytes;
  3912.     }
  3913.     else { /* 
  3914.                  Make sure the compressor can deal with the
  3915.                  data-unloading function in this case. 
  3916.             */
  3917.         if ( p->bufferSize < stripBytes ) {
  3918.             result = codecSpoolErr;
  3919.             goto bail;
  3920.         }
  3921.     }
  3922.     /* 
  3923.         Perform the slower data-loading or progress operation, as
  3924.         required.
  3925.     */
  3926.     
  3927.     if (  p->flushProcRecord.flushProc  || 
  3928.         p->progressProcRecord.progressProc ) {
  3929.  
  3930.         SharedGlobals *sg = (*glob)->sharedGlob;
  3931.  
  3932.         for ( y=0; y < numStrips; y++) {
  3933.             SwapMMUMode(&mmuMode);
  3934.             CompressStrip(cDataPtr,baseAddr,rowBytes,width,sg);
  3935.             SwapMMUMode(&mmuMode);
  3936.             baseAddr += rowBytes<<1;
  3937.             if ( p->flushProcRecord.flushProc ) { 
  3938.                 if ( (result=
  3939.             p->flushProcRecord.flushProc(cDataPtr,stripBytes,
  3940.             p->flushProcRecord.flushRefCon)) != noErr) {
  3941.                     result = codecSpoolErr;
  3942.                     goto bail;
  3943.                 }
  3944.             } else {
  3945.                 cDataPtr += stripBytes;
  3946.             }
  3947.             if (p->progressProcRecord.progressProc) {
  3948.                 if ( (result=
  3949.                     p->progressProcRecord.progressProc)
  3950.                         codecProgressUpdatePercent,
  3951.                         FixDiv(y,numStrips),
  3952.                         p->progressProcRecord.progressRefCon)
  3953.                 )     != noErr ) {
  3954.                     result = codecAbortErr;
  3955.                     goto bail;
  3956.                 }
  3957.             }
  3958.         }
  3959.     } else {
  3960.         SharedGlobals *sg = (*glob)->sharedGlob;
  3961.         short     tRowBytes = rowBytes<<1;
  3962.  
  3963.         SwapMMUMode(&mmuMode);
  3964.         for ( y=numStrips; y--; ) {
  3965.             CompressStrip(cDataPtr,baseAddr,rowBytes,width,sg);
  3966.             cDataPtr += stripBytes;
  3967.             baseAddr += tRowBytes;
  3968.         }
  3969.         SwapMMUMode(&mmuMode);
  3970.     }
  3971. }
  3972. Decompressing an Image
  3973.  
  3974. When decompressing an image, the Image Compression Manager performs these three major tasks:
  3975.     1.    The Image Compression Manager first determines which decompressor is best able to decompress the image. To do so, the Image Compression Manager examines the source image as well as the parameters specified by the application. If the application requested a specific decompressor, the Image Compression Manager uses that decompressor (unless it is not installed, in which case the Image Compression Manager returns an error to the application). If the application did not request a decompressor, the Image Compression Manager chooses the decompressor that will do the best job. The Image Compression Manager collects the information it needs to choose a decompressor by issuing the CDPreDecompress request to each qualifying decompressor (see page 4-63 for a detailed description of the CDPreDecompress function).
  3976.     2.    If the chosen decompressor can handle the image directly, the Image Compression Manager passes the request through to the decompressor. The decompressor then processes the image and returns the image to the specified location.
  3977.     3.    If none of the decompressors can handle all of the conditions (matrix mapping, masking or matting, depth conversion, and so on) the Image Compression Manager allocates an offscreen buffer and passes image bands to the decompressor at a depth that the decompressor can handle by issuing a CDBandDecompress request. (For details on the CDBandDecompress function, see page 4-64). The decompressor processes each band, building the image as it goes. When the image has been completely decompressed, the Image Compression Manager returns control to the application.
  3978. Choosing a Decompressor
  3979.  
  3980. Listing 4-3 on page 4-20 provides an example of how a decompressor is chosen. The Image Compression Manager calls the CDPreDecompress function (described on page 4-63) before an image is decompressed. The decompressor returns information about how it can decompress an image. The Image Compression Manager can fit the destination pixel map to your decompressor’s requirements if it is not able to support decompression to the destination directly. The capability information the decompressor returns includes
  3981. n    depth of pixels for the destination pixel map
  3982. n    minimum band size handled 
  3983. n    extension width and height required
  3984. n    band increment size
  3985. When your decompressor component is called with the CDPreDecompress function, it can handle all aspects of the call itself, or only the most common ones. All decompressors must handle at least one case. 
  3986. This section contains a bulleted list of some of the operations your decompressor component can perform during the decompression operation. The list describes which parameters in the decompression parameters structure (described on page 4-46) indicate the operations are required and which flags in the flags field of the compressor capabilities structure (described on page 4-35) must be set to allow your decompressor to handle them.
  3987. For sequences of images the conditionFlags field in the decompression parameters structure can be used to determine which parameters may have changed since the last decompression operation. These parameters are also indicated in the bulleted list.
  3988. Since your decompressor’s capabilities depend on the full combination of parameters, it must inspect all the relevant parameters before indicating that it will perform one of the operations itself. For instance, if your decompressor has hardware that can perform scaling only if the destination pixel depth is 32 and there is no clipping, then the pre-decompression operation would have to check the following fields in the decompression parameters structure: the matrix field, the pixelSize field of the destination pixel map structure pointed to by the destPixMap field, and the maskBits fields. Only then could the decompressor decide whether to set the codecCanScale flag in the capabilities field of the decompression parameters structure.
  3989. n    Scaling. The decompressor component can look at the matrix and selectively decide which scaling operations it wishes to handle. If the scaling factor specified by the matrix is not unity and your decompressor can perform the scaling operation, it must set the codecCanScale flag in the capabilities field. If it does not, then the decompressor is asked to decompress without scaling, and the Image Compression Manager performs the scaling operation afterward.
  3990. n    Depth conversion. If your component can decompress to the pixel depth indicated by the pixelSize field (of the pixel map structure pointed to by the dstPixmap field of the decompression parameters structure), it should set the wantedPixelSize field of the compressor capability structure to the same value. If it cannot handle that depth, it should specify the closest depth it can handle in the wantedPixelSize field.
  3991. n    Dithering. When determining whether depth conversion can be performed (for converting an image to a lower bit depth, or to a similar bit depth with a different color table), dithering may be required. This is specified by the dither bit in the transferMode field (0x40) of the decompression parameters structure being set. The accuracy field of the decompression parameters structure indicates whether fast dithering is acceptable (accuracy <= codecNormalQuality) or whether true error diffusion dithering should be used (accuracy > codecNormalQuality). Most decompressors do not perform true error diffusion dithering, although they can. When a decompressor cannot perform the dither operation, it should specify the higher bit depth in the wantedPixelSize field of the compressor capability structure and let the Image Compression Manager perform the depth conversion with dithering. Dithering to 16-bit destinations is normally done only if the accuracy field is set to the codecNormalQuality value. However, if your decompressor component can perform dithering fast enough, it could be performed at the lower accuracy settings as well. To indicate that your decompressor can perform dithering as specified, it should set the codecCanTransferMode flag in the capabilities field of the decompression parameters structure.
  3992. n    Color remapping. If the compressed data has an associated color lookup table that is different from the color lookup table of the destination pixel map, then the decompressor can remap the color indices to the closest available ones in the destination itself, or it can let the Image Compression Manager do the remapping. If the decompressor can do the mapping itself, it should set the codecCanRemap flag in the capabilities flags field of the decompression parameters structure.
  3993. n    Extending. If the format for the compressed data is block-oriented, the decompressor can ask that the Image Compression Manager to allocate a buffer which is a multiple of the proper block size by setting the extendWidth and extendHeight fields of the compressor capabilities structure. If the right and bottom edges of the destination image (as determined by the transformed srcRect and dstPixMap.bounds fields of the decompression parameters structure) are not a multiple of the block size that your decompressor handles, and your decompressor cannot handle partial blocks (writing only the pixels that are needed for blocks that cross the left or bottom edge of the destination), then your decompressor component must set the extendWidth and extendHeight fields in the compressor capabilities structure. In this case, the Image Compression Manager creates a buffer large enough so that no partial blocks are needed. Your component can decompress into that buffer. This is then copied to the destination by the Image Compression Manager. Your component can avoid this extra step if it can handle partial blocks. In this case, it should leave the extendWidth and extendHeight fields set to 0. 
  3994. n    Clipping. If clipping must be performed on the image to be decompressed, the maskBits field of the decompression parameters structure is nonzero. In the CDPreDecompress function, it will be a region handle to the actual clipping region. If your decompressor can handle the clipping operation as specified by this region, it should set the codecCanMask bit in the capabilities flags field of the decompression parameters structure. If it does this, then the parameter passed to the CDBandDecompress function in the maskBits field will be a bitmap instead of a region. If desired, your decompressor can save a copy of the actual region structure during the pre-decompression operation.
  3995. n    Matting. If a matte must be applied to the decompressed image, the transferMode field of the decompression parameters structure is set to blend and the mattePixMap field is a handle to the pixel map to be used as the matte. If your decompressor can perform the matte operation, then it should set the codecCanMatte field in the compressor capabilities structure. If it does not, then the Image Compression Manager will perform the matte operation after the decompression is complete.
  3996. n    Pixel shifting. For pixel sizes less than 8 bits per pixel, it may be necessary to shift 
  3997. the destination pixels so that they are at an aligned address. If the pixel size of the destination pixel map is less than 8 and your component handles that depth directly, and the left address of the image is not aligned and your component can handle these pixels directly, then it should set the codecCanShift flag in the capabilities field of the decompression parameters structure. If your component does not set this flag, the Image Compression Manager allocates a buffer for and performs the shifting after the decompression is completed.
  3998. n    Partial extraction. If the source rectangle is not the entire image and the component can decompress only the part of the image specified by the source rectangle, it should set the codecCanSrcExtract flag in the capabilities field of the decompression parameters structure. If it does not, the Image Compression Manger asks the component to decompress the entire image and copy only the required part to the destination.
  3999. Listing 4-3    Preparing for simple decompression
  4000.  
  4001. pascal long 
  4002. CDPreDecompress(Handle storage, register CodecDecompressParams *p)
  4003. {
  4004.     register CodecCapabilities    *capabilities = p->capabilities;
  4005.     Rect    dRect = p->srcRect;
  4006.     
  4007.     /*    
  4008.         Check if the matrix is OK for this decompressor. 
  4009.         This decompressor doesn't do anything fancy. 
  4010.     */
  4011.     
  4012.     if ( !TransformRect(p->matrix,&dRect,nil) )
  4013.         return(codecConditionErr);
  4014.  
  4015.     /*    
  4016.         Decide which depth compressed data this decompressor can 
  4017.         deal with. 
  4018.     */
  4019.     
  4020.     switch ( (*p->imageDescription)->depth )  {
  4021.         case 16:
  4022.             break;
  4023.         default:
  4024.             return(codecConditionErr);
  4025.             break;
  4026.     }
  4027.         /* 
  4028.             This decompressor can deal only with 32-bit pixels. 
  4029.         */
  4030.  
  4031.     capabilities->wantedPixelSize = 32;    
  4032.     
  4033.     /* 
  4034.         The smallest possible band the decompressor can handle is 
  4035.         2 scan lines. 
  4036.     */
  4037.     
  4038.     capabilities->bandMin = 2;
  4039.  
  4040.     /* This decompressor can deal with 2 scan line high bands. */
  4041.  
  4042.     capabilities->bandInc = 2;
  4043.     
  4044.     /* 
  4045.         If this decompressor needed its pixels be aligned on     
  4046.         some integer multiple, you would set extendWidth and 
  4047.         extendHeight to the number of pixels by which you need the
  4048.         destination extended. If you don't have such requirements
  4049.         or if you take care of them yourself, you set extendWidth
  4050.         and extendHeight to 0. 
  4051.     */
  4052.  
  4053.     capabilities->extendWidth = p->srcRect.right & 1;
  4054.     capabilities->extendHeight = p->srcRect.bottom & 1;
  4055.     
  4056.     return(noErr);
  4057. }
  4058. Decompressing a Horizontal Band of an Image
  4059.  
  4060. Listing 4-4 shows how to decompress the horizontal band of an image. The Image Compression Manager calls the CDBandDecompress function when it wants a decompressor to decompress an image or a horizontal band of an image. The pixel data indicated by the baseAddr field is guaranteed to conform to the criteria your decompressor specified in the CDPreDecompress function. 
  4061. Note
  4062. This example does not perform decompression on bands with a bit depth of more than one or an extension of width and height. If the example did do so, it would handle these cases faster.u
  4063. Listing 4-4    Performing a decompression operation
  4064.  
  4065. pascal long
  4066. CDBandDecompress(Handle storage,register CodecDecompressParams *p)
  4067. {
  4068.     Rect                    dRect;
  4069.     long                    offsetH,offsetV;
  4070.     Globals                    **glob  = (Globals **)storage;
  4071.     long                    numLines,numStrips;
  4072.     short                    rowBytes;
  4073.     long                    stripBytes;
  4074.     short                    width;
  4075.     register short                    y;
  4076.     register char        *            baseAddr;
  4077.     char                    *cDataPtr;
  4078.     char                    mmuMode = 1;
  4079.     OSErr                    result = noErr;
  4080.     /* 
  4081.         Calculate the real base address based on the boundary 
  4082.         rectangle. If it's not a linear transformation, this 
  4083.         decompressor does not perform the operation. 
  4084. */
  4085.  
  4086.     dRect = p->srcRect;
  4087.     if ( !TransformRect(p->matrix,&dRect,nil) )
  4088.         return(paramErr);
  4089.  
  4090.     /*     If there is a progress function, give it an open call at
  4091.         the start of this band. 
  4092.     */
  4093.  
  4094.     if (p->progressProcRecord.progressProc)
  4095.         p->progressProcRecord.progressProc(codecProgressOpen,0,
  4096.             p->progressProcRecord.progressRefCon);    
  4097.     
  4098.     /* 
  4099.         Initialize some local variables. 
  4100.     */
  4101.     
  4102.     width = (*p->imageDescription)->width;
  4103.     rowBytes = p->dstPixMap.rowBytes;                    
  4104.     numLines = p->stopLine - p->startLine;                                                    /* number of scan lines
  4105.                                                             in this band */
  4106.     numStrips = (numLines+1)>>1;                                                    /* number of strips in
  4107.                                                             this band */
  4108.     stripBytes = ((width+1)>>1) * 5;                                                    /* number of bytes in
  4109.                                                              1 strip of blocks */
  4110.  
  4111.     cDataPtr = p->data;
  4112.     
  4113.     /* 
  4114.         Adjust the destination base address to be at the beginning
  4115.         of the desired rectangle. 
  4116.     */
  4117.     
  4118.     offsetH = (dRect.left - p->dstPixMap.bounds.left);
  4119.     switch (  p->dstPixMap.pixelSize ) {
  4120.         case 32:
  4121.             offsetH <<=2;                    /* 1 pixel = 4 bytes */
  4122.             break;
  4123.         case 16:
  4124.             offsetH <<=1;                    /* 1 pixel = 2 bytes */
  4125.             break;
  4126.         case 8:                                
  4127.             break;                            /* 1 pixel = 1 byte */
  4128.         default:
  4129.             result = codecErr;                            /* This decompressor doesn't handle
  4130.                                             these cases, although it 
  4131.                                             could. */
  4132.         goto bail;
  4133.     }
  4134.     offsetV = (dRect.top - p->dstPixMap.bounds.top) * rowBytes;
  4135.     baseAddr = p->dstPixMap.baseAddr + offsetH + offsetV;
  4136.     /* 
  4137.         If your decompressor component is skipping some data, 
  4138.         it just skips it here. You can tell because
  4139.         firstBandInFrame indicates this is the first band for a new
  4140.         frame, and if startLine is not 0, then that many lines were
  4141.         clipped out.
  4142.      */
  4143.     if ( (p->conditionFlags & codecConditionFirstBand) &&     
  4144.             p->startLine != 0 ) {
  4145.         if ( p->dataProcRecord.dataProc ) {
  4146.             for ( y=0; y  < p->startLine>>1; y++ )  {
  4147.                 if ( (result=p->dataProcRecord.dataProc
  4148.                          (&cDataPtr,stripBytes,
  4149.                         p->dataProcRecord.dataRefCon)) != noErr ) {
  4150.                     result = codecSpoolErr;
  4151.                     goto bail;
  4152.                 }
  4153.                 cDataPtr += stripBytes;
  4154.             }
  4155.         } else
  4156.             cDataPtr += (p->startLine>>1) * stripBytes;
  4157.     }
  4158. /* 
  4159.     If there is a data-loading function spooling the data to your 
  4160.     decompressor, then you have to decompress the data in the
  4161.     chunk size that is specified, or, if there is a progress
  4162.     function, you must make sure to call it as you go along. 
  4163. */
  4164.     if ( p->dataProcRecord.dataProc ||
  4165.          p->progressProcRecord.progressProc ) {
  4166.  
  4167.         SharedGlobals *sg = (*glob)->sharedGlob;
  4168.     
  4169.         for (y=0; y < numStrips; y++) {
  4170.             if (p->dataProcRecord.dataProc) {
  4171.                 if ( (result=p->dataProcRecord.dataProc
  4172.                          (&cDataPtr,stripBytes,
  4173.                         p->dataProcRecord.dataRefCon)) != noErr ) {
  4174.                     result = codecSpoolErr;
  4175.                     goto bail;
  4176.                 }
  4177.             }
  4178.             SwapMMUMode(&mmuMode);
  4179.             DecompressStrip(cDataPtr,baseAddr,rowBytes,width,sg);
  4180.             SwapMMUMode(&mmuMode);
  4181.             baseAddr += rowBytes<<1;
  4182.             cDataPtr += stripBytes;
  4183.             if (p->progressProcRecord.progressProc) {
  4184.                 if ( (result=p->progressProcRecord.progressProc 
  4185.                         (codecProgressUpdatePercent,
  4186.                     FixDiv(y, numStrips),
  4187.                     p->progressProcRecord.progressRefCon)) != noErr ) {
  4188.                     result = codecAbortErr;
  4189.                      goto bail;
  4190.                 }
  4191.             }
  4192.         }
  4193.     
  4194. /* 
  4195.     Otherwise, do the fast case.
  4196. */ 
  4197.     } else {
  4198.         SharedGlobals *sg = (*glob)->sharedGlob;
  4199.         short    tRowBytes = rowBytes<<1;
  4200.         
  4201.         SwapMMUMode(&mmuMode);
  4202.         for ( y=numStrips; y--; ) {
  4203.             DecompressStrip(cDataPtr,baseAddr,rowBytes,width,sg);
  4204.             baseAddr += tRowBytes;
  4205.             cDataPtr += stripBytes;
  4206.         }
  4207.         SwapMMUMode(&mmuMode);
  4208.     }
  4209. /* 
  4210.     IMPORTANT-- Update the pointer to data in the decompression
  4211.     parameters structure, so that when your decompressor gets the
  4212.     next band, you'll be at the right place in your data.
  4213. */
  4214.  
  4215.     p->data = cDataPtr;
  4216.     
  4217.     if ( p->conditionFlags & codecConditionLastBand ) {
  4218.         /* 
  4219.             Tie up any loose ends on the last band of the frame. 
  4220.         */
  4221.     }
  4222.  
  4223. bail:
  4224.     /*
  4225.         If there is a progress function, give it a close call 
  4226.         at the end of this band. 
  4227.     */
  4228.  
  4229.     if (p->progressProcRecord.progressProc)
  4230.         p->progressProcRecord.progressProc(codecProgressClose,0,
  4231.             p->progressProcRecord.progressRefCon);
  4232.     return(result);
  4233. }
  4234.  
  4235.  
  4236. Image Compressor Components Reference
  4237.  
  4238. This section describes the constants, data structures, and functions that are specific to image compression components.
  4239. Constants
  4240.  
  4241. This section provides details on the image compressor component capability and 
  4242. format flags.
  4243. Image Compressor Component Capabilities
  4244.  
  4245. Apple has defined several component flags for image compressor components. These flags specify information about the capabilities of the component. You set these flags in the componentFlags field of your component’s component description structure. The Image Compression Manager uses these same flags in the compressor information structure to describe the capabilities of image compressors and decompressors. For a complete description of this structure, see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime.
  4246. The compressFlags and decompressFlags fields of the compressor information structure contain a number of flags that define the capabilities of your component.
  4247. Note
  4248. If the compressor information structure is shared, the compressor component uses the component flags that are the same as the compression flags for the component description structure, and the decompressor component uses the component flags that are the same as the decompression flags for the component description structure.u
  4249. The flag bits for those fields are defined as follows (each flag is valid for both fields unless the description states otherwise):
  4250. #define codecInfoDoes1                                                 (1L<<0)            /* works with 1-bit pixel 
  4251.                                                                 maps */
  4252. #define codecInfoDoes2                                                 (1L<<1)            /* works with 2-bit pixel 
  4253.                                                                 maps */
  4254. #define codecInfoDoes4                                                 (1L<<2)            /* works with 4-bit pixel 
  4255.                                                                 maps */
  4256. #define codecInfoDoes8                                                 (1L<<3)            /* works with 8-bit pixel 
  4257.                                                                 maps */
  4258. #define codecInfoDoes16                                                (1L<<4)            /* works with 16-bit pixel 
  4259.                                                                 maps */
  4260.  
  4261. #define codecInfoDoes32                                                 (1L<<5)            /* works with 32-bit pixel 
  4262.                                                                 maps */
  4263. #define codecInfoDoesDither                                                 (1L<<6)            /* supports fast dithering */
  4264. #define codecInfoDoesStretch                                                (1L<<7)            /* stretches to arbitrary 
  4265.                                                                 sizes */
  4266. #define codecInfoDoesShrink                                                (1L<<8)            /* shrinks to arbitrary sizes */#define codecInfoDoesMask                                                 (1L<<9)            /* handles clipping regions */
  4267. #define codecInfoDoesTemporal                                                 (1L<<10)            /* sequential temporal 
  4268.                                                                 compression */
  4269. #define codecInfoDoesDouble                                                 (1L<<11)            /* stretches to double size
  4270.                                                                 exactly */
  4271. #define codecInfoDoesQuad                                                 (1L<<12)            /* stretches to quadruple 
  4272.                                                                 size */
  4273. #define codecInfoDoesHalf                                                 (1L<<13)            /* shrinks to half size */
  4274. #define codecInfoDoesQuarter                                                 (1L<<14)            /* shrinks to one-quarter 
  4275.                                                                 size */
  4276. #define codecInfoDoesRotate                                                 (1L<<15)            /* rotates during 
  4277.                                                                 decompression */
  4278. #define codecInfoDoesHorizFlip                                                (1L<<16)            /* flips horizontally during
  4279.                                                                 decompression */
  4280. #define codecInfoDoesVertFlip                                                 (1L<<17)            /* flips vertically during
  4281.                                                                 decompression */
  4282. #define codecInfoDoesSkew                                                 (1L<<18)            /* skews image during
  4283.                                                                  decompression */
  4284. #define codecInfoDoesBlend                                                 (1L<<19)            /* blends image with matte
  4285.                                                                 during decompression */
  4286. #define codecInfoDoesWarp                                                 (1L<<20)            /* warps image arbitrarily
  4287.                                                                 during decompression */
  4288. #define codecInfoDoesRecompress                                                (1L<<21)            /*     recompresses images without
  4289.                                                                 accumulating errors */
  4290. #define     codecInfoDoesSpool                                            (1L<<22)            /*     uses data-loading or                         
  4291.                                                                 data-unloading function */
  4292. #define     codecInfoDoesRateConstrain                                            (1L<<23)            /* constrains amount of
  4293.                                                                 generated data to
  4294.                                                                 caller-defined limit */
  4295. Flag descriptions
  4296. codecInfoDoes1
  4297. Indicates whether the component can work with pixel maps that contain 1-bit pixels. If this flag is set to 1, then the component can compress or decompress images that contain 1-bit pixels. If this flag is set to 0, then the component cannot handle such images.
  4298. codecInfoDoes2
  4299. Indicates whether the component can work with pixel maps that contain 2-bit pixels. If this flag is set to 1, then the component can compress or decompress images that contain 2-bit pixels. If this flag is set to 0, then the component cannot handle such images.
  4300. codecInfoDoes4
  4301. Indicates whether the component can work with pixel maps that contain 4-bit pixels. If this flag is set to 1, then the component can compress or decompress images that contain 4-bit pixels. If this flag is set to 0, then the component cannot handle such images.
  4302. codecInfoDoes8
  4303. Indicates whether the component can work with pixel maps that contain 8-bit pixels. If this flag is set to 1, then the component can compress or decompress images that contain 8-bit pixels. If this flag is set to 0, then the component cannot handle such images.
  4304. codecInfoDoes16
  4305. Indicates whether the component can work with pixel maps that contain 16-bit pixels. If this flag is set to 1, then the component can compress or decompress images that contain 16-bit pixels. If this flag is set to 0, then the component cannot handle such images.
  4306. codecInfoDoes32
  4307. Indicates whether the component can work with pixel maps that contain 32-bit pixels. If this flag is set to 1, then the component can compress or decompress images that contain 32-bit pixels. If this flag is set to 0, then the component cannot handle such images.
  4308. codecInfoDoesDither
  4309. Indicates whether the component supports dithering. If this flag 
  4310. is set to 1, the component supports dithering of colors. If this flag is set to 0, the component does not support dithering. This flag is only available for decompressor components.
  4311. codecInfoDoesStretch
  4312. Indicates whether the component can stretch images to arbitrary sizes. If this flag is set to 1, the component can stretch images. If this flag is set to 0, the component does not support stretching. This flag is only available for decompressor components.
  4313. codecInfoDoesShrink
  4314. Indicates whether the component can shrink images to arbitrary sizes. If this flag is set to 1, the component can shrink images. If this flag is set to 0, the component does not support shrinking. This flag is only available for decompressor components.
  4315. codecInfoDoesMask
  4316. Indicates whether the component can handle clipping regions. If this flag is set to 1, the component can mask to an arbitrary clipping region. If this flag is set to 0, the component does not support clipping regions. This flag is only available for decompressor components.
  4317. codecInfoDoesTemporal
  4318. Indicates whether the component supports temporal compression in sequences. If this flag is set to 1, the component supports time compression. If this flag is set to 0, the component does not support time compression.
  4319. codecInfoDoesDouble
  4320. Indicates whether the component supports stretching to double size during decompression. Since images are in two dimensions (height and width), this means a total of four times as many pixels. The parameters for the stretch operation are specified in the matrix structure for the request—the component modifies the scaling attributes of the matrix (see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for information about transformation matrices). If this flag is set to 1, the component can stretch an image to exactly four times its original size, up to the maximum size supported by the decompressor. If this flag is set to 0, the component does not support stretching to double size. This flag is valid only for the decompressFlags field.
  4321. codecInfoDoesQuad
  4322. Indicates whether the component supports stretching an image to four times its original size during decompression. Since images are in two dimensions (height and width), this means a total of sixteen times as many pixels. The parameters for the stretch operation are specified in the matrix structure (defined by the MatrixRecord data type) for the request—the component modifies the scaling attributes of the matrix (see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for information about transformation matrices). If this flag is set to 1, the component can stretch an image to exactly sixteen times its original size, up to the maximum size supported by the decompressor. If this flag is set to 0, the component does not support this capability. This flag is valid only for the decompressFlags field.
  4323. codecInfoDoesHalf
  4324. Indicates whether the component supports shrinking an image to half of its original size during decompression. Since images are in two dimensions (height and width), this means a total of one-fourth the number of pixels. The parameters for the shrink operation are specified in the matrix structure for the request—the component modifies the scaling attributes of the matrix (see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for information about transformation matrices). If this flag is set to 1, the component can shrink an image to half size, down to the minimum size specified by the minimumHeight and minimumWidth fields in the compressor information structure. If this flag is set to 0, the component does not support this capability. This flag is valid only for the decompressFlags field.
  4325. codecInfoDoesQuarter
  4326. Indicates whether the component can shrink an image to one-quarter of its original size during decompression. Since images are in two dimensions (height and width), this means a total of one-sixteenth the number of pixels. The parameters for the shrink operation are specified in the matrix structure for the request—the component modifies the scaling attributes of the matrix (see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for information about transformation matrices). If this flag is set to 1, the component can shrink an image to exactly one-quarter of its original size, down to the minimum size specified by the minimumHeight and minimumWidth fields in the compressor information structure. If this flag is set to 0, the component does not support this capability. This flag is valid only for the decompressFlags field.
  4327. codecInfoDoesRotate
  4328. Indicates whether the component can rotate an image during decompression. The parameters for the rotation are specified in the matrix structure for a decompression operation. If this flag is 
  4329. set to 1, the component can rotate the image at decompression time. If this flag is set to 0, the component cannot rotate the resulting image. This flag is valid only for the decompressFlags field.
  4330. codecInfoDoesHorizFlip
  4331. Indicates whether the component can flip an image horizontally during decompression. The parameters for the horizontal flip are specified in the matrix structure for a decompression operation. If this flag is set to 1, the component can flip the image at decompression time. If this flag is set to 0, the component cannot flip the resulting image. This flag is valid only for the decompressFlags field.
  4332. codecInfoDoesVertFlip
  4333. Indicates whether the component can flip an image vertically during decompression. The parameters for the vertical flip are specified in the matrix structure for a decompression operation. If this flag is set to 1, the component can flip the image at decompression time. If this flag is set to 0, the component cannot flip the resulting image. This flag is valid only for the decompressFlags field.
  4334. codecInfoDoesSkew
  4335. Indicates whether the component can skew an image during decompression. Skewing an image distorts it linearly along only a single axis—for example, drawing a rectangular image into a parallelogram-shaped region. The parameters for the skew operation are specified in the matrix structure for the decompression request. If this flag is set to 1, the component can skew an image at decompression time. If this flag is set to 0, the component does not support this capability. This flag is valid only for the decompressFlags field.
  4336. codecInfoDoesBlend
  4337. Indicates whether the component can blend the resulting image with a matte during decompression. The matte is provided by the application in the decompression request. If this flag is set to 1, the component can blend during decompression. If this flag is set to 0, the component does not support this capability. This flag is valid only for the decompressFlags field.
  4338. codecInfoDoesWarp
  4339. Indicates whether the component can warp an image during decompression. Warping an image distorts it along one or more axes, perhaps in a nonlinear fashion, in effect “bending” the resulting region. The parameters for the warp operation are specified in the matrix structure for the decompression request. If this flag is set to 1, the component can warp an image at decompression time. If this flag is set to 0, the component does not support this capability. This flag is valid only for the decompressFlags field.
  4340. codecInfoDoesRecompress
  4341. Indicates whether the component can recompress images it has previously compressed without losing image quality. Many compression algorithms cause image degradation when you apply them repeatedly to the same image. If this flag is set to 1, the component uses an algorithm that does not compromise image quality after repeated compressions. If this flag is set to 0, you should not use the component for repeated compressions of the same image. This flag is only available for compressor components.
  4342. codecInfoDoesSpool
  4343. Indicates whether the component uses data-loading or data-unloading functions. Your application can define data-loading and data-unloading functions to help the component work with images that are too large to be stored in memory (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information about data-loading and data-unloading functions). If this flag is set to 1, the component uses these functions if needed for a given operation. If this flag is set to 0, the component does not use these functions under any circumstances.
  4344. codecInfoDoesRateConstrain
  4345. Indicates the compressor is able to constrain the amount of data it generates when compressing sequences of images to a limit defined by the caller. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for details on data rate constraint functions. This flag is only available for compressor components.
  4346. Format of Compressed Data and Files
  4347.  
  4348. The formatFlags field of the compressor information structure contains a number of flags that define the possible format of compressed data produced by the component 
  4349. and the format of compressed files that the component can handle during decompression. The defined flags are as follows:
  4350. #define codecInfoDepth1                                     (1L<<0)            /* compressed images with 1-bit color             
  4351.                                                     depth available */
  4352. #define codecInfoDepth2                                     (1L<<1)            /* compressed images with 2-bit color
  4353.                                                     depth available */
  4354. #define codecInfoDepth4                                     (1L<<2)            /* compressed images with 4-bit color
  4355.                                                     depth available */
  4356. #define codecInfoDepth8                                     (1L<<3)            /* compressed images with 8-bit color
  4357.                                                     depth available */
  4358. #define codecInfoDepth16                                    (1L<<4)            /* compressed images with 16-bit color
  4359.                                                     depth available */
  4360. #define codecInfoDepth32                                     (1L<<5)            /* compressed images with 32-bit color
  4361.                                                     depth available */
  4362. #define codecInfoDepth24                                     (1L<<6)            /* compressed images with 24-bit color
  4363.                                                     depth available */
  4364. #define codecInfoDepth33                                     (1L<<7)            /* compressed data with monochrome images         
  4365.                                                      of 1-bit color depth */
  4366. #define codecInfoDepth34                                     (1L<<8)            /* compressed images with 2-bit grayscale
  4367.                                                     depth available */
  4368. #define codecInfoDepth36                                     (1L<<9)            /* compressed images with 4-bit grayscale
  4369.                                                     depth available */
  4370. #define codecInfoDepth40                                     (1L<<10)            /* compressed images with 8-bit grayscale
  4371.                                                     depth available */
  4372. #define codecInfoStoresClut            (1L<<11)                                    /* compressed data with custom color 
  4373.                                                     tables */
  4374. #define         codecInfoDoesLossless    
  4375.                                     (1L<<12)            /* compressed data stored lossless
  4376.                                                     format */
  4377. #define     codecInfoSequenceSensitive    
  4378.                                     (1L<<13)         /* compressed data requires non-key 
  4379.                                                     frames to be decompressed in same
  4380.                                                     order as compressed */
  4381. Flag descriptions
  4382. codecInfoDepth1
  4383. Indicates whether the component can work with files containing color images with a color depth of 1 bit. If this flag is set to 1, the component can compress into and decompress from files at this depth. If this flag is set to 0, the component cannot handle such files.
  4384. codecInfoDepth2
  4385. Indicates whether the component can work with files containing color images with a color depth of 2 bits. If this flag is set to 1, the component can compress into and decompress from files at this depth. If this flag is set to 0, the component cannot handle such files.
  4386. codecInfoDepth4
  4387. Indicates whether the component can work with files containing color images with a color depth of 4 bits. If this flag is set to 1, the component can compress into and decompress from files at this depth. If this flag is set to 0, the component cannot handle such files.
  4388. codecInfoDepth8
  4389. Indicates whether the component can work with files containing color images with a color depth of 8 bits. If this flag is set to 1, the component can compress into and decompress from files at this depth. If this flag is set to 0, the component cannot handle such files.
  4390. codecInfoDepth16
  4391. Indicates whether the component can work with files containing color images with a color depth of 16 bits. If this flag is set to 1, the component can compress into and decompress from files at this depth. If this flag is set to 0, the component cannot handle such files.
  4392. codecInfoDepth32
  4393. Indicates whether the component can work with files containing color images with a color depth of 32 bits. If this flag is set to 1, the component can compress into and decompress from files at this depth. If this flag is set to 0, the component cannot handle such files. This flag is the same as the codecInfoDepth24 flag except it contains one extra byte used as an alpha channel.
  4394. codecInfoDepth24
  4395. Indicates whether the component can work with files containing color images with a color depth of 24 bits. If this flag is set to 1, the component can compress into and decompress from files at this depth. If this flag is set to 0, the component cannot handle such files.
  4396. codecInfoDepth33
  4397. Indicates whether the component can work with files containing monochrome images, which have a grayscale depth of 1 bit. If this flag is set to 1, the component can compress into and decompress from files at this depth. If this flag is set to 0, the component cannot handle such files.
  4398. codecInfoDepth34
  4399. Indicates whether the component can work with files containing grayscale images with a grayscale depth of 2 bits. If this flag is set 
  4400. to 1, the component can compress into and decompress from files 
  4401. at this depth. If this flag is set to 0, the component cannot handle such files.
  4402. codecInfoDepth36
  4403. Indicates whether the component can work with files containing grayscale images with a grayscale depth of 4 bits. If this flag is set 
  4404. to 1, the component can compress into and decompress from files 
  4405. at this depth. If this flag is set to 0, the component cannot handle such files.
  4406. codecInfoDepth40
  4407. Indicates whether the component can work with files containing grayscale images with a grayscale depth of 8 bits. If this flag is set 
  4408. to 1, the component can compress into and decompress from files 
  4409. at this depth. If this flag is set to 0, the component cannot handle such files.
  4410. codecInfoStoresClut
  4411. Indicates whether the component can accommodate compressed data with custom color tables. If this flag is set to 1, the component can create compressed files with custom color tables and can decompress files that contain custom color tables. If this flag is set 
  4412. to 0, the component cannot handle such files.
  4413. codecInfoDoesLossless
  4414. Indicates whether the component can perform lossless compression or decompression operations. Lossless compression results in a decompressed image that is exactly the same as the original, uncompressed image. If this flag is set to 1, the component can perform lossless compression or decompression. If this flag is set 
  4415. to 0, the component cannot perform lossless operations. The application specifies a lossless operation by setting the desired quality level to codecLosslessQuality (see Inside Macintosh: QuickTime for more information about quality levels).
  4416. codecInfoSequenceSensitive
  4417. Indicates that the compressed data generated by this image compressor component has the requirement that non-key frames in a sequence be decompressed in the same order that they were compressed.
  4418. Data Types
  4419.  
  4420. This section discusses the data structures that the Image Compression Manager uses to communicate with image compressor and decompressor components.
  4421. The Compressor Capability Structure
  4422.  
  4423. Image compressor components use the compressor capability structure to report their capabilities to the Image Compression Manager. Before compressing or decompressing an image, the Image Compression Manager requests this capability information from the component that will be handling the operation by calling the CDPreCompress or CDPreDecompress function provided by that component. The compressor component examines the compression or decompression parameters and indicates any restrictions on its ability to satisfy the request in a formatted compressor capability structure. The Image Compression Manager then manages the operation according to the capabilities of the component. 
  4424. The CodecCapabilities data type defines the compressor capability structure.
  4425. typedef struct {
  4426.     long                    flags;                        /* control information */
  4427.     short                    wantedPixelSize;                        /* pixel depth for component
  4428.                                                     to use with image */
  4429.     short                    extendWidth;                        /* extension width of image
  4430.                                                     in pixels */
  4431.     short                    extendHeight;                        /* extension height of image
  4432.                                                     in pixels */
  4433.     short                    bandMin;                        /* supported minimum 
  4434.                                                     image band height */
  4435.     short                    bandInc;                        /* common factor of
  4436.                                                     supported band heights */
  4437.     short                    pad;                        /* reserved */
  4438.     unsigned long                    time;                        /* milliseconds operation
  4439.                                                     takes to complete */
  4440. } CodecCapabilities;
  4441.  
  4442. typedef CodecCapabilities *CodecCapabilitiesPtr;
  4443. Field descriptions
  4444. Field descriptions
  4445. flags    Contains flags that contain control information that is used by both the Image Compression Manager and the compressor component. The defined bit positions for this field are discussed later in this section.
  4446. wantedPixelSize
  4447. Indicates the pixel depth the component can use with the specified image. The component determines the pixel depth of the image for the operation by examining the appropriate pixel map.
  4448. extendWidth    Specifies the number of pixels the image must be extended in width. If the component cannot accommodate the image at its 
  4449. given width, the component may request that the Image Compression Manager extend the width of the image by adding pixels to the right edge of the image. This is sometimes necessary to accommodate the component’s block size.
  4450. extendHeight    Specifies the number of pixels the image must be extended in height. If the component cannot accommodate the image at its given height the component may request that the Image Compression Manager extend the height of the image by adding pixels to the bottom of the image. This is sometimes necessary to accommodate the component’s block size.
  4451. bandMin    Contains the minimum image band height supported by the component. Components that can tolerate small values operate under a wider set of memory conditions.
  4452. bandInc    Specifies a common factor of supported image band heights. A component may support only image bands that are an even multiple of some number of pixels high. These components report this common factor in the bandInc field. Set this field to 1 if your component supports bands of any size.
  4453. pad    Reserved for use by Apple.
  4454. time    Indicates the number of milliseconds the operation will take to complete. If the compressor cannot determine this value, it sets this field to 0.
  4455. The flags field of the compressor capability structure contains flags that exchange control information between the Image Compression Manager and the compressor component. Components use flags in the low-order 16 bits to indicate their capabilities to the manager. The Image Compression Manager may use flags in the high-order 16 bits to pass control information to the component. 
  4456. The following flags are defined:
  4457. #define codecCanScale                                            (1L<<0)            /* decompressor scales 
  4458.                                                             information */
  4459. #define codecCanMask                                            (1L<<1)            /* decompressor applies mask to
  4460.                                                             image */
  4461. #define codecCanMatte                                            (1L<<2)            /* decompressor blends image using
  4462.                                                             matte */
  4463. #define codecCanTransform                                            (1L<<3)            /* decompressor works with complex
  4464.                                                             placement matrices */
  4465. #define codecCanTransferMode                                            (1L<<4)            /* decompressor accepts transfer
  4466.                                                             mode */
  4467. #define codecCanCopyPrev                                            (1L<<5)            /* compressor updates previous
  4468.                                                             image buffer */
  4469. #define codecCanSpool                                            (1L<<6)            /* component can use functions to
  4470.                                                             spool data */
  4471. #define codecCanClipVertical                                            (1L<<7)            /* decompressor clips image 
  4472.                                                             vertically */
  4473. #define codecCanClipRectangular                                            (1L<<8)            /* decompressor clips image
  4474.                                                             vertically & horizontally */
  4475. #define codecCanRemapColor                                            (1L<<9)            /* compressor remaps color */
  4476. #define codecCanFastDither                                            (1L<<10)            /* compressor supports fast
  4477.                                                             dithering */
  4478. #define codecCanSrcExtract                                            (1L<<11)            /* compressor extracts portion
  4479.                                                             of source image */
  4480. #define codecCanCopyPrevComp                                            (1L<<12)            /* compressor updates previous 
  4481.                                                             image buffer */
  4482. #define codecCanAsync                                            (1L<<13)            /* component can work
  4483.                                                             asynchronously */
  4484. #define    codecCanMakeMask                                        (1L<<14)            /* decompressor makes
  4485.                                                             modification masks */
  4486. #define codecCanShift                                            (1L<<15)            /* component works with pixels 
  4487.                                                             that are not byte-aligned */
  4488. IMPORTANT
  4489. The following flags are currently unused by the Image Compression Manager: codecCanClipVertical, codecCanClipRectangular, and codecCanFastDither.s
  4490. Flag descriptions
  4491. codecCanScale    Indicates whether the decompressor can scale the image during decompression. The decompressor sets this flag to 1 to indicate that it can scale the image during decompression. The decompressor sets this flag to 0 if it cannot scale the decompressed image.
  4492. codecCanMask    Indicates whether the decompressor can apply a mask to the decompressed image. The decompressor sets this flag to 1 to indicate that it can use a mask to control the image that results from a decompression operation. The decompressor sets this flag to 0 if it cannot work with masks.
  4493. codecCanMatte    Indicates whether the decompressor can blend the decompressed image using a matte. The decompressor sets this flag to 1 to indicate that it can use a blend matte during decompression. The decompressor sets this flag to 0 if it cannot use a blend matte.
  4494. codecCanTransform
  4495. Indicates whether the decompressor can work with complex placement matrixes. The decompressor sets this flag to 1 to indicate that it can work with transformation matrixes during decompression. The decompressor sets this flag to 0 if it cannot work with matrixes.
  4496. codecCanTransferMode
  4497. Indicates whether the decompressor can accept a transfer mode other than source copy or dither copy when displaying a decompressed image. The decompressor sets this flag to 1 to indicate that it can accept transfer modes; otherwise, the decompressor sets this flag to 0.
  4498. codecCanCopyPrev
  4499. Indicates whether the compressor can update the previous image buffer during sequence compression. The compressor sets this flag to 1 to indicate that it can update the previous image buffer. The compressor sets this flag to 0 if it cannot update the buffer.
  4500. codecCanSpool    Indicates whether the component can use data-loading and data-unloading functions to spool data during decompression and compression operations, respectively. Applications may define data-loading and data-unloading functions to handle images that cannot fit into memory (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information on data-loading and data-unloading functions). The component sets this flag to 1 to indicate that it can use these functions. The component sets this flag to 0 to indicate that it cannot use these functions.
  4501. codecCanClipVertical
  4502. Indicates whether the decompressor can clip an image vertically during decompression. The decompressor sets this flag to 1 to indicate that it can clip an image vertically. The decompressor sets this flag to 0 to indicate that it cannot clip an image vertically.
  4503. codecCanClipRectangular
  4504. Indicates whether the decompressor can clip both vertically and horizontally during decompression. The decompressor sets this flag to 1 to indicate that it can clip along both axes. The decompressor sets this flag to 0 to indicate that it cannot clip an image both vertically and horizontally.
  4505. codecCanRemapColor
  4506. Indicates whether the compressor can remap the colors for an image using color tables. The compressor sets this flag to 1 if it can remap colors. The compressor sets this flag to 0 if it cannot remap colors.
  4507. codecCanFastDither
  4508. Indicates whether the compressor supports fast dithering. 
  4509. The compressor sets this flag to 1 if it supports fast dithering. The compressor sets this flag to 0 if it does not support fast dithering. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information about fast dithering.
  4510. codecCanSrcExtract
  4511. Indicates whether the compressor can extract a portion of the source image. The compressor sets this flag to 1 if it can extract a portion of the source image. The compressor sets the flag to 0 if it cannot.
  4512. codecCanCopyPrevComp
  4513. Indicates whether the compressor can update the previous image buffer during sequence compression using compressed data. The compressor sets this flag to 1 to indicate that it can update the previous image buffer. The compressor sets this flag to 0 if it cannot update the buffer.
  4514. codecCanAsync    Indicates whether the component can work asynchronously. The compressor sets this flag to 1 if it can compress and decompress asynchronously; otherwise, it sets this flag to 0.
  4515. codecCanMakeMask
  4516. Indicates whether the decompressor creates modification masks during decompression. These masks indicate which pixels in the decompressed image differ from the previous image and must therefore be displayed. Such masks are useful only when processing sequences. The decompressor sets this flag to 1 to indicate that it creates modification masks. The decompressor sets this flag to 0 if it does not create such masks.
  4517. codecCanShift    Indicates whether the component can work with pixels that are not byte-aligned. This flag is valid only when the source or destination uses fewer than 8 bits per pixel. Components set this flag to 1 if they can read or write pixels that are not byte-aligned. Components set this flag to 0 if pixels must be byte-aligned.
  4518. The Compression Parameters Structure
  4519.  
  4520. Compressor components accept the parameters that govern a compression operation in the form of a data structure. This data structure is called a compression parameters structure. This structure is used by the CDBandCompress and CDPreCompress functions (described on page 4-63 and page 4-62, respectively). 
  4521. The compression parameters structure is defined by the CodecCompressParams data type as follows:
  4522. typedef struct {    
  4523.     ImageSequence                                sequenceID;                            /* sequence identifier ID
  4524.                                                                      (precompress or 
  4525.                                                                     bandcompress) */
  4526.     ImageDescriptionHandle                                imageDescription;                            /* handle to image
  4527.                                                                     description structure
  4528.                                                                     (precompress or
  4529.                                                                      bandcompress) */
  4530.     Ptr                                 data;                            /* location for receipt of 
  4531.                                                                     compressed image data */
  4532.     long                                 bufferSize;                            /* size of buffer for data */
  4533.     long                                 frameNumber;                            /* frame identifier */
  4534.     long                                 startLine;                            /* starting line for band */
  4535.     long                                 stopLine;                            /* ending line for band */
  4536.     long                                conditionFlags;                            /* condition flags */
  4537.     CodecFlags                                 callerFlags;                            /* control information
  4538.                                                                     flags */
  4539.     CodecCapabilitiesPtr                                 *capabilities;                            /* pointer to compressor
  4540.                                                                     capability structure */
  4541.     ProgressProcRecord                                progressProcRecord;                            /* progress function
  4542.                                                                     structure */
  4543.     CompletionProcRecord                                completionProcRecord;                            /* completion function
  4544.                                                                     structure */
  4545.     FlushProcRecord                                 flushProcRecord;                            /* data-unloading function 
  4546.                                                                     structure */
  4547.     PixMap                                 srcPixMap;                            /* pointer to image
  4548.                                                                     (precompress or
  4549.                                                                      bandcompress) */
  4550.     PixMap                                 prevPixMap;                            /*    pointer to pixel map 
  4551.                                                                     for previous image */
  4552.     CodecQ                                 spatialQuality;                            /*    compressed image 
  4553.                                                                     quality */
  4554.     CodecQ                                 temporalQuality;                             /* sequence temporal
  4555.                                                                     quality */
  4556.  
  4557.     Fixed                                 similarity;                            /* similarity between 
  4558.                                                                     adjacent frames */
  4559.     DataRateParamsPtr                                dataRateParams;                            /* data constraint
  4560.                                                                     parameters */
  4561.     long                                reserved;                            /* reserved */
  4562. } CodecCompressParams;
  4563. typedef CodecCompressParams *CodecCompressParamsPtr;
  4564. Field descriptions
  4565. sequenceID
  4566. Contains a unique sequence identifier. If the image to be compressed is part of a sequence, this field contains the sequence identifier that was assigned by the CompressSequenceBegin function. If the image is not part of a sequence, this field is set to 0.
  4567. imageDescription
  4568. Contains a handle to the image description structure that describes the image to be compressed.
  4569. data    Points to a location to receive the compressed image data. This is a 32-bit clean address—do not call StripAddress. If there is not sufficient memory to store the compressed image, the application may choose to write the compressed data to mass storage during the compression operation. The flushProc field identifies the data-unloading function that the application provides for this purpose.
  4570.     This field is used only by the CDBandCompress function.
  4571. bufferSize
  4572. Contains the size of the buffer specified by the data field. Your component sets the value of the bufferSize field to the number of bytes of compressed data written into the buffer. Your component should not return more data than the buffer can hold—it should return a nonzero result code instead.
  4573.     This field is used only by the CDBandCompress function.
  4574. frameNumber
  4575. Contains a frame identifier. Indicates the relative frame number within the sequence. The Image Compression Manager increments this value for each frame in the sequence.
  4576.     This field is used only by the CDBandCompress function.
  4577. startLine    Contains the starting line for the band. This field indicates the starting line number for the band to be compressed. The line number refers to the pixel row in the image, starting from the top of the image. The first row is row number 0.
  4578.     This field is used only by the CDBandCompress function.
  4579. stopLine    Contains the ending line for the band. This field indicates the ending line number for the band to be compressed. The line number refers to the pixel row in the image, starting from the top of the image. The first row in the image is row number 0. 
  4580.     The image band includes the row specified by this field. So, to define a band that contains one row of pixels at the top of an image, you set the startLine field to 0 and the stopLine field to 1.
  4581. conditionFlags
  4582. Contains flags that identify the condition under which your component has been called. This field is used only by the CDBandCompress function. In addition, these fields contain information about actions taken by your component. Condition flags fields contain the following flags:
  4583.                   #define     codecConditionFirstBand                                                 (1L<<0)                
  4584.                   #define     codecConditionLastBand                                                (1L<<1)
  4585.     The codecConditionFirstBand constant is an input flag that indicates if this is the first band in the frame. If this flag is set to 1, then your component is being called for the first time for the current frame.
  4586.     The codecConditionLastBand constant is an input flag that indicates if this is the last band in the frame. If this flag is set to 1, then your component is being called for the last time for the current frame. If the codecConditionFirstBand flag is also set to 1, this is the only time the Image Compression Manager is calling your component for the current frame.
  4587.     The codecConditionCodecChangedMask constant is an output flag that indicates that the component has changed the mask bits. If your image decompressor component can mask decompressed images and if some of the image pixels should not be written to the screen, set to 0 the corresponding bits in the mask defined by the maskBits field in the decompression parameter structure. In addition, set this flag to 1. Otherwise, set this flag to 0.
  4588. callerFlags
  4589. The callerFlags constant is an output flag that contains flags providing further control information. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for information about the Image Compression Manager function control flags. The following flags are available:
  4590. codecFlagUpdatePrevious
  4591. Controls whether your compressor updates the previous image during compression. This flag is only used with sequences that are being temporally compressed. 
  4592. If this flag is set to 1, your compressor should copy the current frame into the previous frame buffer at the end of the frame-compression sequence. Use the source image. 
  4593. codecFlagWasCompressed
  4594. Indicates to your compressor that the image to be compressed has been compressed before. This information may be useful to compressors that can compensate for the image degradation that may otherwise result from repeated compression and decompression of the same image. This flag is set to 1 to indicate that the image was previously compressed. This flag is set to 0 if the image was not previously compressed.
  4595. codecFlagUpdatePreviousComp
  4596. Controls whether your compressor updates the previous image buffer with the compressed image. This flag is only used with temporal compression. If this flag is set to 1, your compressor should update the previous frame buffer at the end of the frame-compression sequence, allowing your compressor to perform frame differencing against the compression results. Use the image that results from 
  4597. the compression operation. If this flag is set to 0, 
  4598. your compressor should not modify the previous frame buffer during compression.
  4599. codecFlagLiveGrab
  4600. Indicates whether the current sequence results from grabbing live video. When working with live video, your compressor should operate as quickly as possible and disable any additional processing, such as compensation for previously compressed data. This flag is set to 1 when you are compressing from a live video source.
  4601.     This field is used only by the CDBandCompress function (described on page 4-63).
  4602. capabilities
  4603. Points to a compressor capability structure. The Image Compression Manager uses this field to determine the capabilities of your compressor component.
  4604.     This field is used only by the CDPreCompress function (described on page 4-62).
  4605. progressProcRecord
  4606. Contains a progress function structure. During the compression operation, your compressor may occasionally call a function that the application provides in order to report your progress (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information about progress functions). This field contains a structure that identifies the progress function. If the progressProc field in this structure is set to nil, the application has not supplied a progress function.
  4607.     This structure is used only by the CDBandCompress function (described on page 4-63).
  4608. completionProcRecord
  4609. Contains a completion function structure. This structure governs whether you perform the compression asynchronously. If the completionProc field in this structure is set to nil, perform the compression synchronously. If this field is not nil, it specifies an application completion function. Perform the compression asynchronously and call that completion function when your component is finished. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for information on calling completion functions. If the completionProc field in this structure has a value of –1, perform the operation asynchronously but do not call the application’s completion function.
  4610.     This structure is used only by the CDBandCompress function.
  4611. flushProcRecord
  4612. Contains a data-unloading function structure. If there is not enough memory to store the compressed image, the application may provide a function that unloads some of the compressed data (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information about data-unloading functions). This field contains a structure that identifies that data-unloading function. 
  4613.     If the application did not provide a data-unloading function, the flushProc field in this structure is set to nil. In this case, your component writes the entire compressed image into the memory location specified by the data field.
  4614.     The data-unloading function structure is defined by the flushProcRecord data type as follows:
  4615.                     struct FlushProcRecord {
  4616.                         FlushProcPtr flushProc; /* pointer to                         
  4617.                                                             data-unloading
  4618.                                                             function */
  4619.                         long flushRefCon;                             /* data-unloading
  4620.                                                             function reference
  4621.                                                             constant */
  4622.                     };
  4623.                     typedef struct FlushProcRecord FlushProcRecord;
  4624.                     typedef FlushProcRecord *FlushProcRecordPtr;
  4625.     The data-unloading function structure is used only by the CDBandCompress function (described on page 4-63).
  4626. srcPixMap    Points to the image to be compressed. The image must be stored in a pixel map structure. The contents of this pixel map differ from a standard 
  4627. pixel map in two ways. First, the rowBytes field is a full 16-bit 
  4628. value—the high-order bit is not necessarily set to 1. Second, the baseAddr field must contain a 32-bit clean address.
  4629.     This field is used only by the CDBandCompress function.
  4630. prevPixMap
  4631. Points to a pixel map containing the previous image. If the 
  4632. image to be compressed is part of a sequence that is being temporally compressed, this field defines the previous image 
  4633. for temporal compression. Your component should then use this previous image as the basis of comparison for the image to be compressed. 
  4634.     If the temporalQuality field is set to 0, do not perform temporal compression. If the codecFlagUpdatePrevious flag or the codecFlagUpdatePreviousComp flag in the flags field is set to 1, update the previous image at the end of the compression operation.
  4635.     The contents of this pixel map differ from a standard pixel map in two ways. First, the rowBytes field is a full 16-bit value—the high-order bit is not necessarily set to 1. Second, the baseAddr field must contain a 32-bit clean address.
  4636.     This field is used only by the CDBandCompress function.
  4637. spatialQuality
  4638. Specifies the desired compressed image quality. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for valid values. 
  4639.     This field is used only by the CDBandCompress function.
  4640.     Check to see if the value of this parameter is nil and, if so, do not write to location 0.
  4641. temporalQuality
  4642. Specifies the desired sequence temporal quality. This field governs the level of compression the application desires with respect to information in successive frames in the sequence. If this field is set to 0, do not perform temporal compression on this frame. See the chapter “Image Compression Manger” in Inside Macintosh: QuickTime for other available values.
  4643.     This field is used only by the CDBandCompress function (described on page 4-63). 
  4644.     Check to see if the value of this parameter is nil and, if so, do not write to location 0.
  4645. similarity
  4646. Indicates the similarity between adjacent frames when performing temporal compression. Your component returns a fixed-point number in this field. That value indicates the relative similarity between the frame just compressed and the previous frame. Valid values range from 0 (key frame) to 1 (identical).
  4647.     This field is used only by the CDBandCompress function.
  4648.     Check to see if the value of this parameter is nil and, if so, do not write to location 0.
  4649. dataRateParams
  4650. Points to the parameters used when performing data rate constraint.
  4651. reserved    Reserved for use by Apple.
  4652. The Decompression Parameters Structure
  4653.  
  4654. Decompressors accept the parameters that govern a decompression operation in the form of a data structure. This data structure is called a decompression parameters structure. It is used by the CDBandDecompress and CDPreDecompress functions, which are described on page 4-64 and page 4-63, respectively.
  4655. The decompression parameters structure is defined by the CodecDecompressParams data type as follows:
  4656. typedef struct {    
  4657.     ImageSequence                                sequenceID;                        /* unique sequence ID
  4658.                                                                 (predecompress,
  4659.                                                                  band decompress) */
  4660.     ImageDescriptionHandle                                 imageDescription;                        /* handle to image description
  4661.                                                                  structure (predecompress,
  4662.                                                                 band decompress) */
  4663.     Ptr                                 data;                        /* compressed image data */
  4664.     long                                 bufferSize;                        /* size of data buffer */
  4665.     long                                 frameNumber;                        /* frame identifier */
  4666.     long                                 startLine;                        /* starting line for band */
  4667.     long                                 stopLine;                        /* ending line for band */
  4668.     long                                conditionFlags;                        /* condition flags */
  4669.     CodecFlags                                 callerFlags;                        /* control flags */
  4670.     CodecCapabilitiesPtr                                 *capabilities;                        /* pointer to compressor 
  4671.                                                                 capability structure
  4672.                                                                 (predecompress,
  4673.                                                                 band decompress) */
  4674.     ProgressProcRecord                                progressProcRecord;                            
  4675.                                                             /* progress function 
  4676.                                                                 structure */
  4677.     CompletionProcRecord                                completionProcRecord;    
  4678.                                                             /* completion function 
  4679.                                                                 structure */
  4680.     DataProcRecord                                dataProcRecord;                        /* data-loading function 
  4681.                                                                 structure */
  4682.     CGrafPtr                                 port;                        /* pointer to color
  4683.                                                                 graphics port for image
  4684.                                                                 (predecompress,
  4685.                                                                 band decompress) */
  4686.     PixMap                                 dstPixMap;                        /* destination pixel map
  4687.                                                                 (predecompress,
  4688.                                                                 band decompress) */
  4689.     BitMapPtr                                 maskBits;                        /* update mask */
  4690.     PixMapPtr                                 mattePixMap;                        /* blend matte pixel map */
  4691.     Rect                                 srcRect;                        /* source rectangle
  4692.                                                                  (predecompress,
  4693.                                                                 band decompress) */
  4694.     MatrixRecordPtr                                *matrix;                        /* pointer to matrix structure
  4695.                                                                 (predecompress,
  4696.                                                                 band decompress) */
  4697.     CodecQ                                 accuracy;                        /* desired accuracy
  4698.                                                                 (predecompress,
  4699.                                                                 band decompress) */
  4700.     short                                 transferMode;                        /* transfer mode(predecompress,
  4701.                                                                 band decompress) */
  4702.     long                                reserved[2];                        /* reserved */
  4703. } CodecDecompressParams;
  4704. typedef CodecDecompressParams *CodecDecompressParamsPtr;
  4705. Field descriptions
  4706. sequenceID    Contains the unique sequence identifier. If the image to be decompressed is part of a sequence, this field contains the sequence identifier that was assigned by the Image Compression Manager’s DecompressSequenceBegin function. If the image is not part of a sequence, this field is set to 0.
  4707. imageDescription
  4708. Contains a handle to the image description structure that describes the image to be decompressed.
  4709. data    Points to the compressed image data. This must be a 32-bit clean address. The bufferSize field indicates the size of this data buffer. If the entire compressed image does not fit in memory, the application should provide a data-loading function, identified by the dataProc field of the data-loading function structure stored 
  4710. in the dataProcRecord field.
  4711.     This field is used only by the CDBandDecompress function (described on page 4-64).
  4712. bufferSize    Specifies the size of the image data buffer.
  4713.     This field is used only by the CDBandDecompress function.
  4714. frameNumber    Contains a frame identifier. Indicates the relative frame number within the sequence. The Image Compression Manager increments this value for each frame in the sequence.
  4715.     This field is used only by the CDBandDecompress function (described on page 4-64).
  4716. startLine    Specifies the starting line for the band. This field indicates the starting line number for the band to be decompressed. The line number refers to the pixel row in the image, starting from the top of the image. The first row in the image is row number 0.
  4717.     This field is used only by the CDBandDecompress function.
  4718. stopLine    Specifies the ending line for the band. This field indicates the ending line number for the band to be decompressed. The line number refers to the pixel row in the image, starting from the top of the image. The first row is row number 0.
  4719.     The image band includes the row specified by this field. So, to define a band that contains one row of pixels at the top of an image, you set the startLine field to 0 and the stopLine field to 1.
  4720.     This field is used only by the CDBandDecompress function.
  4721. conditionFlags    Contains flags that identify the condition under which your component has been called (in order to save the component some work). The flags in this field are passed to the component in the CDBandCompress and CDPreDecompress functions when conditions change to save it some work. In addition, these fields contain information about actions taken by your component. Condition flags fields contain the following flags:
  4722.                                     #define codecConditionFirstFrame                                                    (1L<<2)                                
  4723.                                     #define codecConditionNewDepth                                                    (1L<<3)            
  4724.                                     #define codecConditionNewTransform                                                    (1L<<4)            
  4725.                                     #define codecConditionNewSrcRect                                                    (1L<<5)            
  4726.                                     #define codecConditionNewMatte                                                    (1L<<7)                
  4727.                                     #define     codecConditionNewTransferMode                                                (1L<<8)            
  4728.                                     #define codecConditionNewClut                                                    (1L<<9)            
  4729.                                     #define codecConditionNewAccuracy                                                    (1L<<10)            
  4730.                                     #define codecConditionNewDestination                                                    (1L<<11)            
  4731.                                     #define codecConditionCodecChangedMask                                                    (1L<<31)            
  4732.     The codecConditionFirstBand constant is an input flag that indicates if this is the first band in the frame. If this flag is set to 1, then your component is being called for the first time for the current frame.
  4733.     The codecConditionLastBand constant is an input flag that indicates if this is the last band in the frame. If this flag is set to 1, then your component is being called for the last time for the current frame. If the codecConditionFirstBand flag is also set to 1, this is the only time the Image Compression Manager is calling your component for the current frame.
  4734.     The codecConditionFirstFrame constant is an input flag that indicates that this is the first frame to be decompressed for this image sequence.
  4735.     The codecConditionNewDepth constant is an input flag that indicates that the depth of the destination has changed for this image sequence.
  4736.     The codecConditionNewTransform constant is an input flag that indicates that the transformation matrix has changed for this sequence. 
  4737.     The codecConditionNewSrcRect constant is an input flag that indicates that the source rectangle has changed for this sequence.
  4738.     The codecConditionNewMatte is an input flag that indicates that the matte pixel map has changed for this sequence. 
  4739.     The codecConditionNewTransferMode constant is an input flag that indicates that the transfer mode has changed for this sequence.
  4740.     The codecConditionNewClut constant is an input flag that indicates that the color lookup table has changed for this sequence.
  4741.     The codecConditionNewAccuracy constant is an input flag that indicates to the component that the accuracy parameter has changed for this sequence.
  4742.     The codecConditionNewDestination constant is an input flag that indicates to the component that the destination pixel map has changed for this sequence.
  4743.     The codecConditionCodecChangedMask constant is an output flag that indicates that the component has changed the mask bits. If your image decompressor component can mask decompressed images and if some of the image pixels should not be written to the screen, set the corresponding bits in the mask (defined by the maskBits field in the decompression parameter structure) to 0. In addition, set this flag to 1. Otherwise, set this flag to 0.
  4744. callerFlags     Contains flags providing further control information. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for information about the Image Compression Manager function control flags. Four flags are available:
  4745.     The codecFlagUpdatePrevious flag controls whether your compressor updates the previous image during compression. This flag is only used with sequences that are being temporally compressed. If this flag is set to 1, your compressor should copy the current frame into the previous frame buffer at the end of the frame- compression sequence. Use the source image. 
  4746.     The codecFlagWasCompressed flag indicates to your compressor that the image to be compressed has been compressed before. This information may be useful to compressors that can compensate for the image degradation that may otherwise result from repeated compression and decompression of the same image. This flag is set to 1 to indicate that the image was previously compressed. This flag is set to 0 if the image was not previously compressed.
  4747.     The codecFlagUpdatePreviousComp flag controls whether your compressor updates the previous image buffer with the compressed image. This flag is only used with temporal compression. If this flag is set to 1, your compressor should update the previous frame buffer at the end of the frame compression sequence, allowing your compressor to perform frame differencing against the compression results. Use the image that results from the compression operation. If this flag is set to 0, your compressor should not modify the previous frame buffer during compression.
  4748.     The codecFlagLiveGrab flag indicates whether the current sequence results from grabbing live video. When working with live video, your compressor should operate as quickly as possible and disable any additional processing, such as compensation for previously compressed data. This flag is set to 1 when you are compressing from a live video source. This field is used only by the CDBandCompress function (described on page 4-63).
  4749. capabilities    Points to a compressor capability structure (described on page 4-35). The Image Compression Manager uses this parameter to determine the capabilities of your decompressor component.
  4750.     This field is used only by the CDPreDecompress function (described on page 4-63).
  4751. progressProcRecord
  4752. Contains a progress function structure. During the decompression operation, your decompressor may occasionally call a function that the application provides in order to report your progress (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information about progress functions). This field contains a structure that identifies the progress function. If the progressProc field of this structure is set to nil, the application did not provide a progress function. 
  4753.     The progress function structure is defined by the progressProcRecord data type as follows:
  4754.                     struct ProgressProcRecord {
  4755.                         ProgressProcPtr     progressProc;                                     /*     pointer to
  4756.                                                                      progress
  4757.                                                                      function */
  4758.                         long                      progressRefCon;                /*         reference
  4759.                                                                      constant */
  4760.                     };
  4761.                 typedef struct ProgressProcRecord ProgressProcRecord;
  4762.                 typedef ProgressProcRecord *ProgressProcRecordPtr;
  4763.     This field is used only by the CDBandDecompress function (described on page 4-64).
  4764. completionProcRecord
  4765. Contains a completion function structure. This field governs whether you perform the decompression asynchronously. If the completionProc field in this structure is set to nil, perform the decompression synchronously. If this field is not nil, it specifies an application completion function. Perform the decompression asynchronously and call that completion function when your component is finished. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for information on calling completion functions. If this field has a value of –1, perform the operation asynchronously but do not call the application’s completion function. 
  4766.     The completion function structure is defined by the CompletionProcRecord data type as follows:
  4767.                     struct CompletionProcRecord {
  4768.                      CompletionProcPtr completionProc;                                                /* pointer to
  4769.                                                                         completion
  4770.                                                                         function */
  4771.                      long                         completionRefCon;                        /* reference
  4772.                                                                         constant */
  4773.                     };
  4774.             typedef struct CompletionProcRecord CompletionProcRecord;
  4775.             typedef CompletionProcRecord *CompletionProcRecordPtr;
  4776.     This field is used only by the CDBandDecompress function (described on page 4-64).
  4777. dataProcRecord
  4778. Contains a data-loading function structure. If the data stream is not all in memory, your component may call an application function that loads more compressed data (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information about data-loading functions). This field contains a structure that identifies that data-loading function. If the application did not provide a data-loading function, the dataProc field in this structure is set to nil. In this case, the entire image must be in memory at the location specified by the data field.
  4779.     The data-loading function structure is defined by the dataProcRecord data type as follows:
  4780.                     struct DataProcRecord {
  4781.                         DataProcPtr dataProc;                            /* pointer to data-loading
  4782.                                                         function */
  4783.                         long dataRefCon;                            /* reference constant */
  4784.                     };
  4785.                     typedef struct DataProcRecord DataProcRecord;
  4786.                     typedef DataProcRecord *DataProcRecordPtr;
  4787.     This field is used only by the CDBandDecompress function.
  4788. port    Points to the color graphics port that receives the decompressed image.
  4789. dstPixMap    Points to the pixel map where the decompressed image is to be displayed. The GDevice global variable is set to the destination graphics device.
  4790.     The contents of this pixel map differ from a standard pixel map in two ways. First, the rowBytes field is a full 16-bit value—the high-order bit is not necessarily set to 1. Second, the baseAddr field must contain a 32-bit clean address.
  4791. maskBits    Contains an update mask. If your component can mask result data, use this mask to indicate which pixels in the destination pixel map to update. Your component indicates whether it can mask with the codecCanMask flag in the flags field of the compressor capability structure referred to by the capabilities field. This field is updated in response to the CDPreDecompress request (described on page 4-63). See “The Compressor Capability Structure” beginning on page 4-35 for a description of the compressor capability structure.
  4792.     If the mask has not changed since the last CDBandDecompress request, the codecConditionCodecChangedMask flag in the conditionFlags field is set to 0.
  4793.     This field is used only by the CDBandDecompress function.
  4794. mattePixMap    Points to a pixel map that contains a blend matte. The matte can be defined at any supported pixel depth—the matte depth need not correspond to the source or destination depths. The matte must be in the coordinate system of the source image. If the application does not want to apply a blend matte, this field is set to nil.
  4795.     The contents of this pixel map differ from a standard pixel map in two ways. First, the rowBytes field is a full 16-bit value—the high-order bit is not necessarily set to 1. Second, the baseAddr field must contain a 32-bit clean address.
  4796.     This field is used only by the CDBandDecompress function (described on page 4-64).
  4797. srcRect    Points to a rectangle defining the portion of the image to decompress. This rectangle must lie within the boundary rectangle of the compressed image, which is defined by the width and height fields of the image description structure referred to by the imageDescription field.
  4798. matrix    Points to a matrix structure that specifies how to transform the image during decompression.
  4799. accuracy    Specifies the accuracy desired in the decompressed image. Values for this parameter are on the same scale as compression quality. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for valid values.
  4800. transferMode    Specifies the QuickDraw transfer mode for the operation. For details on QuickDraw’s transfer modes, see the chapter “Basic QuickDraw” in Inside Macintosh: Imaging.
  4801. reserved    Reserved for use by Apple.
  4802. Functions
  4803.  
  4804. This section describes the external interface that image compressor components must support. It also discusses the utility functions that the Image Compression Manager provides for use by compressors and decompressors.
  4805. This discussion has been divided into two parts. They discuss the image compressor component functions that are called by the Image Compression Manager. “Direct Functions” deals with image compressor component functions that are called by the Image Compression Manager in response to application requests. “Indirect Functions” discusses image compressor component functions that may be called by the Image Compression Manager at any time. The next section, “Image Compression Manager Utility Functions,” defines a number of Image Compression Manager utility functions that are available to image compressor components.
  4806. Apple has defined a functional interface for image compressor components. For information about the functions your component must support, see the individual function descriptions that follow. 
  4807. You can use the following constants to refer to the request codes for each of the functions that your component must support.
  4808. #define codecGetCodecInfo                                                0x00        /* CDGetCodecInf */
  4809. #define codecGetCompressionTime                                                0x01        /* CDGetCompressionTime */
  4810. #define codecGetMaxCompressionSize                                                0x02        /*    CDGetMaxCompressionSize */
  4811. #define codecPreCompress                                                0x03        /* CDPreCompress */
  4812. #define codecBandCompress                                                0x04        /* CDBandCompress */
  4813. #define codecPreDecompress                                                0x05        /* CDPreDeCompress */
  4814. #define codecBandDecompress                                                0x06        /* CDBandDeCompress */
  4815. #define codecCDSequenceBusy                                                0x07        /* CDSequenceBusy */
  4816. #define codecGetCompressedImageSize                                                0x08        /* CDGetCompressedImageSize */
  4817. #define codecGetSimilarity                                                0x09        /* CDGetSimilarity */
  4818. #define codecTrimImage                                                0x0A        /* CDTrimImage */
  4819. Note
  4820. Code selectors 0 through 127 are reserved for use by Apple. Code selectors 128 through 191 are subtype specific. Code selectors 192 through 255 are vendor specific. Code selectors 256 through 32767 are available for general use. Negative selectors are reserved by the Component Manager.u
  4821. Direct Functions
  4822.  
  4823. These functions are invoked by the Image Compression Manager in direct response to application functions. Refer to the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for descriptions of the functions that applications call.
  4824. CDGetCodecInfo
  4825.  
  4826. Your component receives the CDGetCodecInfo request whenever an application calls the Image Compression Manager’s GetCodecInfo function.
  4827. pascal ComponentResult CDGetCodecInfo (CodecInfo *info);
  4828. info    Contains a pointer to the compressor information structure (defined by the CodecInfo data type) to update. Your component should report its capabilities by formatting a compressor information structure in the location specified by this parameter.
  4829. DESCRIPTION
  4830. Your component returns a formatted compressor information structure defining its capabilities. 
  4831. Both compressors and decompressors may receive this request.
  4832. RESULT CODESnoErr    0    No error    
  4833. codecUnimpError    –8962    Feature not implemented by this compressor    
  4834.  
  4835. SEE ALSO
  4836. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for a description of the compressor information structure.
  4837. CDGetMaxCompressionSize
  4838.  
  4839. Your component receives the CDGetMaxCompressionSize request whenever an application calls the Image Compression Manager’s GetMaxCompressionSize function. The caller uses this function to determine the maximum size the data will become for a given parameter.
  4840. pascal ComponentResult CDGetMaxCompressionSize (PixMapHandle src,
  4841.                                                              const Rect *srcRect,
  4842.                                                              short depth,
  4843.                                                              CodecQ quality, 
  4844.                                                              long *size);
  4845. src    Contains a handle to the source image. The source image is stored in a pixel map structure. Applications use the size information you return to allocate buffers that may be used for more than one image. Consequently, your compressor should not consider the contents of the image when determining the maximum compressed size. Rather, you should consider only the quality level, pixel depth, and image size. 
  4846.     This parameter may be set to nil. In this case the application has not supplied a source image—your component should use the other parameters to determine the characteristics of the image to be compressed.
  4847. srcRect    Contains a pointer to a rectangle defining the portion of the source image to compress.
  4848. depth    Specifies the depth at which the image is to be compressed. Values of 1, 2, 4, 8, 16, 24, and 32 indicate the number of bits per pixel for color images. Values of 33, 34, 36, and 40 indicate 1-bit, 2-bit, 4-bit, and 8-bit grayscale, respectively, for grayscale images. 
  4849. quality    Specifies the desired compressed image quality. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for valid values.
  4850. size    Contains a pointer to a field to receive the maximum size, in bytes, of the compressed image.
  4851. DESCRIPTION
  4852. Your component returns a long integer indicating the maximum number of bytes of compressed data that results from compressing the specified image.
  4853. Only compressors receive this request.
  4854. RESULT CODESnoErr    0    No error    
  4855. paramErr    –50    Invalid parameter specified    
  4856.  
  4857. CDGetCompressionTime
  4858.  
  4859. Your component receives the CDGetCompressionTime request whenever an application calls the Image Compression Manager’s GetCompressionTime function. 
  4860. pascal ComponentResult CDGetCompressionTime (PixMapHandle src, 
  4861.                                                         const Rect *srcRect,
  4862.                                                         short depth, CodecQ                         
  4863.                                                         *spatialQuality, 
  4864.                                                         CodecQ *temporalQuality,
  4865.                                                         unsigned long *time);
  4866. src    Contains a handle to the source image. The source image is stored in a pixel map. Applications may use the time information you return for more than one image. Consequently, your compressor should not consider the contents of the image when determining the maximum compression time. Rather, you should consider only the quality level, pixel depth, and image size. 
  4867.     This parameter may be set to nil. In this case the application has not supplied a source image—your component should use the other parameters to determine the characteristics of the image to be compressed.
  4868. srcRect    Contains a pointer to a rectangle defining the portion of the source image to compress.
  4869. depth    Specifies the depth at which the image is to be compressed. Values of 1, 2, 4, 8, 16, 24, and 32 indicate the number of bits per pixel for color images. Values of 33, 34, 36, and 40 indicate 1-bit, 2-bit, 4-bit, and 8-bit grayscale, respectively, for grayscale images. 
  4870. spatialQuality
  4871. Contains a pointer to a field containing the desired compressed image quality. The compressor sets this field to the closest actual quality that it can achieve. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for valid values. Check to see if the value of this field is nil and, if so, do not write to location 0.
  4872. temporalQuality
  4873. Contains a pointer to a field containing the desired sequence temporal quality. The compressor sets this field to the closest actual quality that it can achieve. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for valid values. Check to see if the value of this field is nil and, if so, do not write to location 0.
  4874. time    Contains a pointer to a field to receive the compression time, in milliseconds. If your component cannot determine the amount of time required to compress the image, set this field to 0. Check to see if the value of this field is nil and, if so, do not write to location 0.
  4875. DESCRIPTION
  4876. Your component returns a long integer indicating the maximum number of milliseconds it would require to compress the specified image.
  4877. Only compressors receive this request.
  4878. RESULT CODESnoErr    0    No error    
  4879. paramErr    –50    Invalid parameter specified    
  4880. codecUnimpError    –8962    Feature not implemented by this compressor    
  4881.  
  4882. CDGetSimilarity
  4883.  
  4884. Your component receives the CDGetSimilarity request whenever an application calls the Image Compression Manager’s GetSimilarity function. Your component compares the specified compressed image to a picture stored in a pixel map and returns a value indicating the relative similarity of the two images.
  4885. Note
  4886. The CDGetSimilarity function is optional. If your component doesn’t support it, it should return the codecUnimpError result code.u
  4887. pascal ComponentResult CDGetSimilarity (PixMapHandle src, 
  4888.                                                 const Rect *srcRect,
  4889.                                                  ImageDescriptionHandle desc,         
  4890.                                                 Ptr data, 
  4891.                                                 Fixed *similarity);
  4892. src    Contains a handle to the noncompressed image. The image is stored in a pixel map structure.
  4893. srcRect    Contains a pointer to a rectangle defining the portion of the image to compare to the compressed image.
  4894. desc    Contains a handle to the image description structure that defines the compressed image for the operation.
  4895. data    Contains a pointer to the compressed image data.
  4896. similarity
  4897. Contains a pointer to a field that is to receive the similarity value. Your component sets this field to reflect the relative similarity of the two images. Valid values range from 0 (key frame) to 1 (identical).
  4898.     DESCRIPTION
  4899. If the source image has been temporally compressed and is not a key frame (that is, the image relies on other frames that are not available to your component at this time), your component should return a result value of paramErr.
  4900. Only decompressors receive this request.
  4901. RESULT CODESnoErr    0    No error    
  4902. paramErr    –50    Invalid parameter specified    
  4903. memFullErr    –108    Not enough memory available    
  4904. codecUnimpError    –8962    Feature not implemented by this compressor    
  4905.  
  4906. CDGetCompressedImageSize
  4907.  
  4908. Your component receives the CDGetCompressedImageSize request whenever an application calls the Image Compression Manager’s GetCompressedImageSize function.
  4909. You can use the CDGetCompressedImageSize function when you are extracting a single image from a sequence; therefore, you don’t have an image description structure and don’t know the exact size of one frame. In this case, the Image Compression Manager calls the component to determine the size of the data.
  4910. pascal ComponentResult CDGetCompressedImageSize 
  4911.                                         (ImageDescriptionHandle desc,
  4912.                                          Ptr data, long bufferSize, 
  4913.                                          DataProcRecordPtr dataProc,
  4914.                                          long *dataSize);
  4915. desc    Contains a handle to the image description structure that defines the compressed image for the operation.
  4916. data    Points to the compressed image data.
  4917. bufferSize
  4918. Specifies the size of the buffer to be used by the data-loading 
  4919. function specified by the dataProc parameter. If the application did not specify a data-loading function this parameter is nil.
  4920. dataProc    Points to a data-loading function structure. If the data stream is not all in memory when the application calls GetCompressedImageSize, your component may call an application function that loads more compressed data (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information about data-loading functions). This parameter contains a pointer to a structure that identifies the data-loading function. If the application did not provide a data-loading function, this parameter is nil. In this case, the entire image must be in memory at the location specified by the data parameter.
  4921. dataSize    Contains a pointer to a field that is to receive the size, in bytes, of the compressed image.
  4922. DESCRIPTION
  4923. Your component returns a long integer indicating the number of bytes of data in the compressed image. You may want to store the image size somewhere in the image description structure, so that you can respond to this request quickly. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information about image description structures.
  4924. Only decompressors receive this request.
  4925. RESULT CODESnoErr    0    No error    
  4926. paramErr    –50    Invalid parameter specified    
  4927. codecSpoolErr    –8966    Error loading or unloading data    
  4928.  
  4929. CDTrimImage
  4930.  
  4931. Your component receives the CDTrimImage request whenever an application calls the TrimImage function. Your component adjusts a compressed image to the boundaries defined by a rectangle specified by your application. The resulting image data is still compressed and is in the same compression format as the source image.
  4932. Note
  4933. The CDTrimImage function is optional. If your component doesn’t support it, it should return the codecUnimpError result code.u
  4934. pascal ComponentResult CDTrimImage 
  4935.                     (ImageDescriptionHandle desc, Ptr inData, 
  4936.                      long inBufferSize, DataProcRecordPtr dataProc,
  4937.                      Ptr outData, long outBufferSize, 
  4938.                      FlushProcRecordPtr flushProc, Rect *trimRect,
  4939.                      ProgressProcRecordPtr progressProc);
  4940. desc    Contains a handle to the image description structure that describes the compressed image. Your component updates this image description to refer to the resized image.
  4941. inData    Points to the compressed image data. If the entire compressed image cannot be stored at this location, the application may provide a data-loading function (see the description of the dataProc parameter to this function for details). This is a 32-bit clean address.
  4942. inBufferSize
  4943. Specifies the size of the buffer to be used by the data-loading 
  4944. function specified by the dataProc parameter. If the application did not specify a data-loading function, this parameter is nil.
  4945. dataProc    Points to a data-loading function structure. If the data stream is not all in memory when the application calls the Image Compression Manager’s GetCompressedImageSize function, your component may call an application function that loads more compressed data (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information about data-loading functions). This parameter contains a pointer to a structure that identifies the data-loading function. If the application did not provide a data-loading function, this parameter is nil. In this case, the entire image must be in memory at the location specified by the inData parameter.
  4946. outData    Points to a buffer to receive the trimmed image. If there is not sufficient memory to store the compressed image, the application may choose to write the compressed data to mass storage during the compression operation. The flushProc parameter identifies the data-unloading function. This is a 32-bit clean address.
  4947.     Your component should place the actual size of the resulting image into the dataSize field of the image description referred to by the desc parameter.
  4948. outBufferSize
  4949. Specifies the size of the buffer to be used by the data-unloading 
  4950. function specified by the flushProc parameter. If the application did not specify a data-unloading function, this parameter is nil.
  4951. flushProc    Points to a data-unloading function structure. If there is not enough memory to store the compressed image, your component may call an application function that unloads some of the compressed data (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information about data-unloading functions). This parameter contains a pointer to a structure that identifies that data-unloading function. If the application did not provide a data-unloading function, this parameter is nil. In this case, your component writes the entire compressed image into the memory location specified by the outData parameter.
  4952. trimRect    Contains a pointer to a rectangle that defines the desired image dimensions. Your component adjusts the rectangle values so that they refer to the same rectangle in the resulting image (this is necessary whenever data is removed from the beginning of the image).
  4953. progressProc
  4954. Points to a progress function structure. During the operation, your component should occasionally call an application function to report its progress (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information about progress functions). This parameter contains a pointer to a structure that identifies that progress function. If the application did not provide a progress function, this parameter is nil.
  4955. DESCRIPTION
  4956. Only decompressors receive this request. If the TrimImage function has been called by an application, the resulting picture should be modified.
  4957. RESULT CODESnoErr    0    No error    
  4958. paramErr    –50    Invalid parameter specified    
  4959. memFullErr    –108    Not enough memory available    
  4960. noCodecErr    –8961    Image Compression Manager could not find the specified compressor    
  4961. codecUnimpErr    –8962    Feature not implemented by this compressor    
  4962. codecSpoolErr    –8966    Error loading or unloading data    
  4963. codecAbortErr    –8967    Operation aborted by the progress function    
  4964.  
  4965. CDCodecBusy
  4966.  
  4967. Your component receives the CDCodecBusy request whenever an application calls the CDSequenceBusy function. Your component must report whether it is performing an asynchronous operation.
  4968. pascal ComponentResult CDCodecBusy (ImageSequence seq);
  4969. seq    Contains the unique sequence identifier assigned by the Image Compression Manager’s CompressSequenceBegin or DecompressSequenceBegin function.
  4970. DESCRIPTION
  4971. Your component should return a result code value of 1 if an asynchronous operation is in progress; it should return a result code value of 0 if the component is not performing an asynchronous operation. You can indicate an error by returning a negative result code.
  4972. Both compressors and decompressors may receive this request.
  4973. RESULT CODESnoErr    0    No error    
  4974. codecUnimpError    –8962    Feature not implemented by this compressor    
  4975.  
  4976. Indirect Functions
  4977.  
  4978. This section describes functions that are invoked by the Image Compression Manager but do not correspond to functions called by applications. The Image Compression Manager may call these functions at any time.
  4979. CDPreCompress
  4980.  
  4981. Your component receives the CDPreCompress request before compressing an image or a band of an image. The Image Compression Manager also calls this function when processing a sequence. In that case, the Image Compression Manager calls this function whenever the parameters governing the sequence operation have changed substantially. Your component indicates whether it can perform the requested compression operation.
  4982. pascal ComponentResult CDPreCompress 
  4983.                                                 (CodecCompressParams *params);
  4984. params    Contains a pointer to a compression parameters structure. The Image Compression Manager places the appropriate parameter information in that structure. See “The Compression Parameters Structure” beginning on page 4-40 for details.
  4985. DESCRIPTION
  4986. Your component should return a 0 result code to indicate that it can handle the request. In addition, your component indicates any limitations on its capabilities in a compressor capability structure (see “The Compressor Capability Structure” beginning on page 4-35 for details). Your component should return a result code of codecConditionError if it cannot field the compression request.
  4987. Only compressors receive this request.
  4988. RESULT CODESnoErr    0    No error    
  4989. paramErr    –50    Invalid parameter specified    
  4990. codecConditionErr    –8972    Component cannot perform requested operation    
  4991.  
  4992. CDBandCompress
  4993.  
  4994. Your component receives the CDBandCompress request to compress an image or a band of an image. The image may be part of a sequence.
  4995. pascal ComponentResult CDBandCompress 
  4996.                                                 (CodecCompressParams *params);
  4997. params    Contains a pointer to a compression parameters structure. The Image Compression Manager places the appropriate parameter information in that structure. See “The Compression Parameters Structure” beginning on page 4-40 for a complete description of the compression parameters structure.
  4998. DESCRIPTION
  4999. Only compressors receive this request.
  5000. RESULT CODESnoErr    0    No error    
  5001. paramErr    –50    Invalid parameter specified    
  5002. codecSpoolErr    –8966    Error loading or unloading data    
  5003. codecAbortErr    –8967    Operation aborted by the progress function    
  5004.  
  5005. CDPreDecompress
  5006.  
  5007. Your component receives the CDPreDecompress request before decompressing an image or a band of an image. The Image Compression Manager also calls this function when processing a sequence. In that case, the Image Compression Manager calls this function whenever the parameters governing the sequence operation have changed substantially. Your component indicates whether it can perform the requested decompression operation.
  5008. pascal ComponentResult CDPreDecompress 
  5009.                                             (CodecDecompressParams *params);
  5010. params    Contains a pointer to a decompression parameters structure. The Image Compression Manager places the appropriate parameter information in that structure. See “The Decompression Parameters Structure” beginning on page 4-46 for a complete description of the decompression parameters structure.
  5011. DESCRIPTION
  5012. Your component should return a 0 result code to indicate that it can handle the request. In addition, your component indicates any limitations on its capabilities in a 
  5013. compressor capability structure (see page 4-35 for a description of that structure). Return a result code of codecConditionError if your component cannot field the decompression request.
  5014. Only decompressors receive this request.
  5015. RESULT CODESnoErr    0    No error    
  5016. paramErr    –50    Invalid parameter specified    
  5017. codecConditionErr    –8972    Component cannot perform requested operation    
  5018.  
  5019. CDBandDecompress
  5020.  
  5021. Your component receives the CDBandDecompress request to decompress an image or a band of an image. The image may be part of a sequence.
  5022. pascal ComponentResult CDBandDecompress 
  5023.                                             (CodecDecompressParams *params);
  5024. params    Contains a pointer to a decompression parameters structure. The Image Compression Manager places the appropriate parameter information in that structure. See “The Decompression Parameters Structure” beginning on page 4-46 for a complete description of the decompression parameters structure.
  5025. DESCRIPTION
  5026. Only decompressors receive these requests.
  5027. RESULT CODESnoErr    0    No error    
  5028. paramErr    –50    Invalid parameter specified    
  5029. codecSpoolErr    –8966    Error loading or unloading data    
  5030. codecAbortErr    –8967    Operation aborted by the progress function    
  5031.  
  5032. Image Compression Manager Utility Functions
  5033.  
  5034. The Image Compression Manager provides a number of utility functions for use by your compressor component. These utility functions allow compressor components to manipulate the Image Compression Manager’s image description structures.
  5035. SetImageDescriptionExtension
  5036.  
  5037. Your component may use the SetImageDescriptionExtension function to create or update the extended data for an image. 
  5038. pascal OSErr SetImageDescriptionExtension
  5039.                                             (ImageDescriptionHandle desc,
  5040.                                              Handle extension, 
  5041.                                              long idType);
  5042. desc    Contains a handle to the appropriate image description structure. The SetImageDescriptionExtension function updates the size of the image description to accommodate the new extended data.
  5043. extension    Contains a handle to the new extended data. The SetImageDescriptionExtension function uses this data to update the extended data for the image described by the image description referred to by the desc parameter. 
  5044. idType    Specifies the extension’s type value. Use this parameter to assign a data type to the extension. Use a four-character code, similar to an OSType field value.
  5045. DESCRIPTION
  5046. The Image Compression Manager appends the extended data for an image to the appropriate image description structure (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for information about image description structures). Note that each compressor type may have its own format for the extended data that is stored with an image. The extended data is similar in concept to the user data that applications can associate with QuickTime movies—see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for more information about user data in QuickTime movies. Once you have added extended data to an image, you cannot delete it.
  5047. RESULT CODESnoErr    0    No error    
  5048. paramErr    –50    Invalid parameter specified    
  5049. memFullErr    –108    Not enough memory available    
  5050. noCodecErr    –8961    Image Compression Manager could not find the specified compressor    
  5051. codecExtensionNotFoundErr    –8971    Requested extension is not in the image description    
  5052.  
  5053. GetImageDescriptionExtension
  5054.  
  5055. Your component may use the GetImageDescriptionExtension function to obtain the extended data for an image. 
  5056. pascal OSErr GetImageDescriptionExtension
  5057.                                                  (ImageDescriptionHandle desc, 
  5058.                                                     Handle *extension, 
  5059.                                                     long idType, long index);
  5060. desc    Contains a handle to the appropriate image description structure.
  5061. extension    Contains a pointer to a field to receive a handle to the returned data. The GetImageDescriptionExtension function returns the extended data for the image described by the image description referred to by the desc parameter. The function correctly sizes the handle for the data it returns.
  5062. idType    Specifies the extension’s type value. Use this parameter to determine the data type of the extension. This parameter contains a four-character code, similar to an OSType field value.
  5063. index    Specifies the extension’s index value. 
  5064. DESCRIPTION
  5065. The Image Compression Manager appends the extended data for an image to the appropriate image description structure (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for information about image description structures). Note that each compressor type may have its own format for the extended data that is stored with an image. The extended data is similar in concept to the user data that applications can associate with QuickTime movies—see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for more information about user data in QuickTime movies. Once you have added extended data to an image, you cannot delete it.
  5066. RESULT CODESnoErr    0    No error    
  5067. paramErr    –50    Invalid parameter specified    
  5068. memFullErr    –108    Not enough memory available    
  5069. noCodecErr    –8961    The Image Compression Manager could not find the specified compressor    
  5070. codecExtensionNotFoundErr    –8971    Requested extension is not in the image description    
  5071.  
  5072. RemoveImageDescriptionExtension
  5073.  
  5074. The RemoveImageDescriptionExtension function allows you to remove an extension based on its type or index.
  5075. pascal OSErr RemoveImageDescriptionExtension 
  5076.                                                 (ImageDescription **desc,
  5077.                                                  long type, long index);
  5078. desc    Contains a handle to the appropriate image description structure.
  5079. type    Specifies the extension’s type, starting at 1. Use this parameter to specify the data type of the extension to be removed. This parameter contains a four-character code, similar to an OSType field value. Set the value of this parameter to 0 to indicate that any extension should be matched, with the index parameter becoming an index into all of the extensions.
  5080. index    Specifies the extension’s index value. 
  5081. RESULT CODEcodecExtensionNotFoundErr    –8971    Requested extension is not in the image description    
  5082.  
  5083. CountImageDescriptionExtensionType
  5084.  
  5085. The CountImageDescriptionExtensionType function counts the number of image description extensions in a specified image description structure. 
  5086. pascal OSErr CountImageDescriptionExtensionType
  5087.                                                 (ImageDescription **desc,
  5088.                                                  long type, long *count);
  5089. desc    Contains a handle to the image description structure with the extensions to be counted.
  5090. type    Indicates the type of extension to be counted in the specified image description structure. Set the value of this parameter to 0 to match any extension, and return a count of all of the extensions.
  5091. count    Contains a pointer to an integer that indicates how many extensions of the given type are in the given image description structure.
  5092. GetNextImageDescriptionExtensionType
  5093.  
  5094. The GetNextImageDescriptionExtensionType function retrieves the next extension type encountered after the one you specify.
  5095. pascal OSErr GetNextImageDescriptionExtensionType
  5096.                                      (ImageDescription **desc, long *type);
  5097. desc    Contains a handle to the image description structure with the extension under scrutiny.
  5098. type    Contains a pointer to an integer that indicates the type of the extension after which this function is to return the next extension type. Set the value of this parameter to 0 to return the first type found. Point to a value of 0 to return the first type found.
  5099. DESCRIPTION
  5100. If GetNextImageDescriptionExtensionType returns a value of 0 in the type parameter, no more types could be found.
  5101.  
  5102.  
  5103. Summary of Image Compressor Components
  5104.  
  5105. C Summary
  5106.  
  5107. Constants
  5108.  
  5109. #define compressorComponentType                                                'imco'         /* compressor component type */
  5110. #define decompressorComponentType                                                 'imdc'         /* decompressor component type */
  5111. /* selector values */
  5112. #define codecGetCodecInfo                                                0x00        /* CDGetCodecInfo */
  5113. #define codecGetCompressionTime                                                0x01        /* CDGetCompressionTime */
  5114. #define codecGetMaxCompressionSize                                                0x02        /* CDGetMaxCompressionSize */
  5115. #define codecPreCompress                                                0x03        /* CDPreCompress */
  5116. #define codecBandCompress                                                0x04        /* CDBandCompress */
  5117. #define codecPreDecompress                                                0x05        /* CDPreDecompress */
  5118. #define codecBandDecompress                                                0x06        /* CDBandDecompress */
  5119. #define codecCDSequenceBusy                                                0x07        /* CDSequenceBusy */
  5120. #define codecGetCompressedImageSize                                                0x08        /* CDGetCompressedImageSize */
  5121. #define codecGetSimilarity                                                0x09        /* CDGetSimilarity */
  5122. #define codecTrimImage                                                0x0A        /* CDTrimImage */
  5123. /* image compressor component capabilities flags */
  5124. #define codecCanScale                                            (1L<<0)            /* decompressor scales
  5125.                                                             information */
  5126. #define codecCanMask                                            (1L<<1)            /* decompressor applies mask to
  5127.                                                             image */
  5128. #define codecCanMatte                                            (1L<<2)            /* decompressor blends image using
  5129.                                                             matte */
  5130. #define codecCanTransform                                            (1L<<3)            /* decompressor works with complex
  5131.                                                             placement matrices */
  5132. #define codecCanTransferMode                                            (1L<<4)            /* decompressor accepts transfer
  5133.                                                             mode */
  5134. #define codecCanCopyPrev                                            (1L<<5)            /* compressor updates previous
  5135.                                                             image buffer */
  5136. #define codecCanSpool                                            (1L<<6)            /* component can use functions to
  5137.                                                             spool data */
  5138. #define codecCanClipVertical                                            (1L<<7)            /* decompressor clips image 
  5139.                                                             vertically */
  5140. #define codecCanClipRectangular                                            (1L<<8)            /* decompressor clips image
  5141.                                                             vertically & horizontally */
  5142. #define codecCanRemapColor                                            (1L<<9)            /* compressor remaps color */
  5143. #define codecCanFastDither                                            (1L<<10)            /* compressor supports fast
  5144.                                                             dithering */
  5145. #define codecCanSrcExtract                                            (1L<<11)            /* compressor extracts portion
  5146.                                                             of source image */
  5147. #define codecCanCopyPrevComp                                            (1L<<12)            /* compressor updates previous 
  5148.                                                             image buffer */
  5149. #define codecCanAsync                                            (1L<<13)            /* component can work
  5150.                                                             asynchronously */
  5151. #define    codecCanMakeMask                                        (1L<<14)            /* decompressor makes
  5152.                                                             modification masks */
  5153. #define codecCanShift                                            (1L<<15)            /* component works with pixels 
  5154.                                                             that are not byte-aligned */
  5155. /* compressor component condition flags passed to component in
  5156.     CDBandDecompress and CDPreDecompress functions indicate changes */
  5157. #define codecConditionFirstBand                                                     (1L<<0)            /* (input) first band 
  5158.                                                                     in frame */
  5159. #define codecConditionLastBand                                                    (1L<<1)            /* (input) last band
  5160.                                                                     in frame */
  5161. #define codecConditionFirstFrame                                                    (1L<<2)            /* (input) first frame to be
  5162.                                                                      decompressed in this
  5163.                                                                      sequence */
  5164. #define codecConditionNewDepth                                                    (1L<<3)            /* (input) depth of
  5165.                                                                      destination */
  5166. #define codecConditionNewTransform                                                    (1L<<4)            /* (input) transformation
  5167.                                                                      matrix has changed */
  5168. #define codecConditionNewSrcRect                                                    (1L<<5)            /* (input) source     rectangle */
  5169. #define codecConditionNewMask                                                    (1L<<6)            /* (input) mask bitmap has
  5170.                                                                      changed */
  5171. #define codecConditionNewMatte                                                    (1L<<7)            /* (input) matte pixel map */
  5172. #define     codecConditionNewTransferMode                                                (1L<<8)            /* (input) transfer mode */
  5173. #define codecConditionNewClut                                                    (1L<<9)            /* (input) color lookup
  5174.                                                                      table */
  5175. #define codecConditionNewAccuracy                                                    (1L<<10)            /* accuracy parameter has
  5176.                                                                     changed */
  5177. #define codecConditionNewDestination                                                    (1L<<11)            /*(input) destination pixel
  5178.                                                                     map */
  5179. #define codecConditionCodecChangedMask                                                    (1L<<31)            /* (output) component has
  5180.                                                                     changed mask bits */
  5181. /* compressor and decompressor flag bits */
  5182. #define codecInfoDoes1                                             (1L<<0)            /* works with 1-bit pixel maps */
  5183. #define codecInfoDoes2                                             (1L<<1)            /* works with 2-bit pixel maps */
  5184. #define codecInfoDoes4                                             (1L<<2)            /* works with 4-bit pixel maps */
  5185. #define codecInfoDoes8                                             (1L<<3)            /* works with 8-bit pixel maps */
  5186. #define codecInfoDoes16                                            (1L<<4)            /* works with 16-bit pixel maps */
  5187. #define codecInfoDoes32                                             (1L<<5)            /* works with 32-bit pixel maps */
  5188. #define codecInfoDoesDither                                             (1L<<6)            /* supports fast dithering */
  5189. #define codecInfoDoesStretch                                            (1L<<7)            /* stretches to arbitrary sizes */
  5190. #define codecInfoDoesShrink                                            (1L<<8)            /* shrinks to arbitrary sizes */#define codecInfoDoesMask                                             (1L<<9)            /* handles clipping regions */
  5191. #define codecInfoDoesTemporal                                             (1L<<10)            /* sequential temporal 
  5192.                                                             compression */
  5193. #define codecInfoDoesDouble                                             (1L<<11)            /* stretches to double size
  5194.                                                              exactly */
  5195. #define codecInfoDoesQuad                                             (1L<<12)            /* stretches to quadruple size */
  5196. #define codecInfoDoesHalf                                             (1L<<13)            /* shrinks to half size */
  5197. #define codecInfoDoesQuarter                                             (1L<<14)            /* shrinks to one quarter size */
  5198. #define codecInfoDoesRotate                                             (1L<<15)            /* rotates during decompression */
  5199. #define codecInfoDoesHorizFlip                                             (1L<<16)            /* flips horizontally during
  5200.                                                             decompression */
  5201. #define codecInfoDoesVertFlip                                             (1L<<17)            /* flips vertically during
  5202.                                                             decompression */
  5203. #define codecInfoDoesSkew                                             (1L<<18)            /* skews image during
  5204.                                                             decompression */
  5205. #define codecInfoDoesBlend                                             (1L<<19)            /* blends image with matte during
  5206.                                                             decompression */
  5207. #define codecInfoDoesWarp                                             (1L<<20)            /* warps image arbitrarily during
  5208.                                                             decompression */
  5209. #define codecInfoDoesRecompress                                            (1L<<21) /*     recompresses images without
  5210.                                                             accumulating errors */
  5211. #define codecInfoDoesSpool                                            (1L<<22)         /*         uses data-loading or
  5212.                                                              data-unloading function */
  5213. #define codecInfoDoesRateConstrain
  5214.                                             (1L<<23)            /* constrains amount of generated
  5215.                                                             data to caller-defined limit */
  5216. /* compressor and decompressor format flag bits */
  5217. #define codecInfoDepth1 (1L<<0)                                            /* compressed images with 1-bit
  5218.                                                 color depth available */
  5219. #define codecInfoDepth2 (1L<<1)                                            /* compressed images with 2-bit
  5220.                                                 color depth available */
  5221. #define codecInfoDepth4 (1L<<2)                                            /* compressed images with 4-bit
  5222.                                                 color depth available */
  5223. #define codecInfoDepth8 (1L<<3)                                            /* compressed images with 8-bit
  5224.                                                 color depth available */
  5225. #define codecInfoDepth16    (1L<<4)                                        /* compressed images with 16-bit
  5226.                                                 color depth available */
  5227. #define codecInfoDepth32            (1L<<5)                                /* compressed images with 32-bit
  5228.                                                 color depth available */
  5229. #define codecInfoDepth24(1L<<6)                                            /* compressed images with 24-bit
  5230.                                                 color depth available */
  5231. #define codecInfoDepth33(1L<<7)                                            /* compressed data with monochrome images of
  5232.                                                 1-bit color depth */
  5233. #define codecInfoDepth34(1L<<8)                                            /* compressed images with
  5234.                                                 2-bit grayscale depth available */
  5235. #define codecInfoDepth36(1L<<9)                                            /* compressed images with 4-bit grayscale
  5236.                                                 depth available */
  5237. #define codecInfoDepth40(1L<<10)                                         /* compressed images with 8-bit grayscale
  5238.                                                 depth available */
  5239. #define codecInfoStoresClut 
  5240.                                 (1L<<11)            /* compressed data with custom color
  5241.                                                 tables */
  5242. #define            codecInfoDoesLossless    
  5243.                                 (1L<<12)            /* compressed data stored lossless format */
  5244. #define            codecInfoSequenceSensitive 
  5245.                                 (1L<<13) /* compressed data requires non-key frames 
  5246.                                                 to be compressed in same order as
  5247.                                                 compressed */
  5248. Data Types
  5249.  
  5250. typedef struct {
  5251.     long                    flags;                        /* control information */
  5252.     short                    wantedPixelSize;                        /* pixel depth for component to use
  5253.                                                     with image */
  5254.     short                    extendWidth;                        /* extension width of image in pixels */
  5255.     short                    extendHeight;                        /* extension height of image in pixels */
  5256.     short                    bandMin;                        /* supported minimum image band height */
  5257.     short                    bandInc;                        /* common factor of supported band
  5258.                                                     heights */
  5259.     short                    pad;                        /* reserved */
  5260.     unsigned long                    time;                        /* milliseconds operation takes to
  5261.                                                     complete */
  5262. } CodecCapabilities;
  5263. typedef CodecCapabilities *CodecCapabilitiesPtr;
  5264. typedef struct {    
  5265.     ImageSequence                                sequenceID;                            /* sequence identifier ID
  5266.                                                                      (precompress or 
  5267.                                                                     bandcompress) */
  5268.     ImageDescriptionHandle                                imageDescription;                            /* handle to image
  5269.                                                                     description structure
  5270.                                                                     (precompress or
  5271.                                                                      bandcompress) */
  5272.     Ptr                                 data;                            /* location for receipt of 
  5273.                                                                     compressed image data */
  5274.     long                                 bufferSize;                            /* size of buffer for data */
  5275.     long                                 frameNumber;                            /* frame identifier */
  5276.     long                                 startLine;                            /* starting line for band */
  5277.     long                                 stopLine;                            /* ending line for band */
  5278.     long                                conditionFlags;                            /* condition flags */
  5279.     CodecFlags                                 callerFlags;                            /* control info flags */
  5280.     CodecCapabilities                                 *capabilities;                            /* pointer to compressor
  5281.                                                                     capability structure */
  5282.     ProgressProcRecord                                progressProcRecord;                            /* progress function
  5283.                                                                     structure */
  5284.     CompletionProcRecord                                completionProcRecord;                            /* completion function
  5285.                                                                     structure */
  5286.     FlushProcRecord                                 flushProcRecord;                            /* data-unloading function 
  5287.                                                                     structure */
  5288.     PixMap                                 srcPixMap;                            /* pointer to image
  5289.                                                                     (precompress or
  5290.                                                                      bandcompress) */
  5291.     PixMap                                 prevPixMap;                            /*    pointer to pixel map 
  5292.                                                                     for previous image */
  5293.     CodecQ                                 spatialQuality;                            /*    compressed image 
  5294.                                                                     quality */
  5295.     CodecQ                                 temporalQuality;                             /* sequence temporal
  5296.                                                                     quality */
  5297.     Fixed                                 similarity;                            /* similarity between 
  5298.                                                                     adjacent frames */
  5299.     DataRateParamsPtr                                dataRateParams;                            /* pointer to the data rate
  5300.                                                                     parameters structure */
  5301.     long                                reserved;                            /* reserved */
  5302. } CodecCompressParams;
  5303. typedef CodecCompressParams *CodecCompressParamsPtr;
  5304. typedef struct {    
  5305.     ImageSequence                                sequenceID;                            /* unique sequence ID
  5306.                                                                     (predecompress,
  5307.                                                                      band decompress) */
  5308.     ImageDescriptionHandle                                 imageDescription;                            /* handle to image                 
  5309.                                                                     description structure
  5310.                                                                     (predecompress,
  5311.                                                                     band decompress) */
  5312.     Ptr                                 data;                            /* compressed image data */
  5313.     long                                 bufferSize;                            /* size of data buffer */
  5314.     long                                 frameNumber;                            /* frame identifier */
  5315.     long                                 startLine;                            /* starting line for band */
  5316.     long                                 stopLine;                            /* ending line for band */
  5317.     long                                conditionFlags;                            /* condition flags */
  5318.     CodecFlags                                 callerFlags;                            /* control flags */
  5319.     CodecCapabilities                                 *capabilities;                            /* pointer to compressor 
  5320.                                                                     capability structure
  5321.                                                                     (predecompress,
  5322.                                                                     band decompress) */
  5323.     ProgressProcRecord                                progressProcRecord;                            /* progress function
  5324.                                                                     structure */
  5325.     CompletionProcRecord                                completionProcRecord;    /* completion function 
  5326.                                                                     structure */
  5327.     DataProcRecord                                dataProcRecord;                            /* data-loading function 
  5328.                                                                     structure */
  5329.     CGrafPtr                                 port;                            /* pointer to color
  5330.                                                                     graphics port for image
  5331.                                                                     (predecompress,
  5332.                                                                     band decompress) */
  5333.     PixMap                                 dstPixMap;                            /* destination pixel map
  5334.                                                                     (predecompress,
  5335.                                                                      band decompress) */
  5336.     BitMapPtr                                 maskBits;                            /* update mask */
  5337.     PixMapPtr                                 mattePixMap;                            /* blend matte pixel map */
  5338.     Rect                                 srcRect;                            /* source rectangle
  5339.                                                                      (predecompress,
  5340.                                                                      band decompress) */
  5341.     MatrixRecord                                *matrix;                            /* pointer to matrix 
  5342.                                                                     structure
  5343.                                                                     (predecompress,
  5344.                                                                      band decompress) */
  5345.     CodecQ                                 accuracy;                            /* desired accuracy
  5346.                                                                     (predecompress,
  5347.                                                                      band decompress) */
  5348.     short                                 transferMode;                            /* transfer mode
  5349.                                                                     (predecompress,
  5350.                                                                      band decompress) */
  5351.     long                                reserved[2];                            /* reserved */
  5352. } CodecDecompressParams;
  5353.  
  5354. typedef CodecDecompressParams *CodecDecompressParamsPtr;
  5355. /* progress function structure */
  5356. typedef struct ProgressProcRecord ProgressProcRecord;                                                                        
  5357. typedef ProgressProcRecord *ProgressProcRecordPtr;
  5358. struct ProgressProcRecord {
  5359.         ProgressProcPtr progressProc;                                        /* pointer to your progress function */
  5360.         long progressRefCon;                                        /* reference constant for use by
  5361.                                                     your progress function */
  5362. };
  5363.  
  5364. /* completion function structure */
  5365. typedef struct CompletionProcRecord CompletionProcRecord;
  5366. typedef CompletionProcRecord *CompletionProcRecordPtr;
  5367.  
  5368. struct CompletionProcRecord {
  5369.         CompletionProcPtr completionProc;                                            /* pointer to completion function */
  5370.         long completionRefCon;                                            /* reference constant used by 
  5371.                                                         completion function */
  5372. };
  5373.  
  5374. /* data-loading structure */
  5375. typedef struct DataProcRecord DataProcRecord;
  5376. typedef DataProcRecord *DataProcRecordPtr;
  5377.  
  5378. struct DataProcRecord {
  5379.         DataProcPtr dataProc;                                            /* pointer to data-loading function */
  5380.         long dataRefCon;                                            /* reference constant used by
  5381.                                                         data-loading function */ 
  5382. };
  5383.  
  5384. /* data-unloading structure */
  5385. typedef struct FlushProcRecord FlushProcRecord;
  5386. typedef FlushProcRecord *FlushProcRecordPtr;
  5387. struct FlushProcRecord {
  5388.         FlushProcPtr flushProc;                                /* pointer to data-unloading function */
  5389.         long flushRefCon;                                /* reference constant used by data-unloading
  5390.                                             function */
  5391. };
  5392. Functions
  5393.  
  5394. Direct Functions
  5395. pascal ComponentResult CDGetCodecInfo 
  5396. (CodecInfo *info);
  5397. pascal ComponentResult CDGetMaxCompressionSize    
  5398. (PixMapHandle src, const Rect *srcRect, 
  5399. short depth, CodecQ quality, long *size);
  5400. pascal ComponentResult CDGetCompressionTime
  5401. (PixMapHandle src, const Rect *srcRect, 
  5402. short depth, CodecQ *spatialQuality, 
  5403. CodecQ *temporalQuality, unsigned long *time);
  5404. pascal ComponentResult CDGetSimilarity
  5405. (PixMapHandle src, const Rect *srcRect, ImageDescriptionHandle desc, Ptr data, 
  5406. Fixed *similarity);
  5407. pascal ComponentResult CDGetCompressedImageSize
  5408. (ImageDescriptionHandle desc, Ptr data, 
  5409. long bufferSize, DataProcRecordPtr dataProc, long *dataSize);
  5410. pascal ComponentResult CDTrimImage
  5411. (ImageDescriptionHandle desc, Ptr inData, 
  5412. long inBufferSize, DataProcRecordPtr dataProc, Ptr outData, long outBufferSize, FlushProcRecordPtr flushProc, Rect *trimRect, ProgressProcRecordPtr progressProc);
  5413. pascal ComponentResult CDCodecBusy
  5414. (ImageSequence seq);
  5415. Indirect Functions
  5416. pascal ComponentResult CDPreCompress
  5417. (CodecCompressParams *params);
  5418. pascal ComponentResult CDBandCompress
  5419. (CodecCompressParams *params);
  5420. pascal ComponentResult CDPreDecompress
  5421. (CodecDecompressParams *params);
  5422. pascal ComponentResult CDBandDecompress
  5423. (CodecDecompressParams *params);
  5424. Image Compression Manager Utility Functions
  5425.  
  5426. pascal OSErr SetImageDescriptionExtension 
  5427. (ImageDescriptionHandle desc, Handle extension, long idType);
  5428. pascal OSErr GetImageDescriptionExtension
  5429. (ImageDescriptionHandle desc, 
  5430. Handle *extension, long idType, long index);
  5431. pascal OSErr RemoveImageDescriptionExtension
  5432. (ImageDescription **desc, long type, 
  5433. long index);
  5434. pascal OSErr CountImageDescriptionExtensionType
  5435. (ImageDescription **desc, long type, 
  5436. long *count);
  5437. pascal OSErr GetNextImageDescriptionExtensionType
  5438. (ImageDescription **desc, long *type);
  5439. Pascal Summary
  5440.  
  5441. Constants
  5442.  
  5443. CONST
  5444. compressorComponentType                                        ='imco'; {compressor component type}
  5445. decompressorComponentType                                        ='imdc'; {decompressor component type}
  5446.  
  5447.     {selector values}
  5448.     codecGetCodecInfo                                    = $00;            {CDGetCodecInfo}
  5449.     codecGetCompressionTime                                    = $01;            {CDGetCompressionTime}
  5450.     codecGetMaxCompressionSize                                    = $02;            {CDGetMaxCompressionSize}
  5451.     codecPreCompress                                    = $03;            {CDPreCompress}
  5452.     codecBandCompress                                    = $04;            {CDBandCompress}
  5453.     codecPreDecompress                                    = $05;            {CDPreDeCompress}
  5454.     codecBandDecompress                                    = $06;            {CDBandDeCompress}
  5455.     codecCDSequenceBusy                                    = $07;            {CDSequenceBusy}
  5456.     codecGetCompressedImageSize                                    = $08;            {CDGetCompressedImageSize}
  5457.     codecGetSimilarity                                    = $09;            {CDGetSimilarity}
  5458.     codecTrimImage                                    = $0a;            {CDTrimImage}
  5459.     {image compressor component capabilities flags}
  5460.     codecCanScale                                    = $1;            {decompressor scales information}
  5461.     codecCanMask                                    = $2;            {decompressor applies mask to image}
  5462.     codecCanMatte                                    = $4;            {decompressor blends using matte}
  5463.     codecCanTransform                                    = $8;            {decompressor works with complex }
  5464.                                                     { placement matrices}
  5465.     codecCanTransferMode                                    = $10;            {decompressor accepts transfer mode}
  5466.     codecCanCopyPrev                                    = $20;            {compressor updates previous buffer}
  5467.     codecCanSpool                                    = $40;            {component uses functions to spool }
  5468.                                                     { data}
  5469.     codecCanClipVertical                                    = $80;            {decompressor clips vertically}
  5470.     codecCanClipRectangular                                    = $100;            {decompressor clips vertically }
  5471.                                                     { & horizontally}
  5472.     codecCanRemapColor                                    = $200;            {compressor remaps color}
  5473.     codecCanFastDither                                    = $400;            {compressor does fast dithering}    
  5474.     codecCanSrcExtract                                    = $800;            {compressor extracts portion of }
  5475.                                                     { source image}
  5476.     codecCanCopyPrevComp                                    = $1000;            {compressor updates previous buffer}
  5477.     codecCanAsync                                    = $2000;            {component works asynchronously}
  5478.     codecCanMakeMask                                    = $4000;            {decompressor makes masks}
  5479.     codecCanShift                                    = $8000;            {component works with pixels }
  5480.                                                     { that are not byte-aligned}
  5481.     {condition flags}
  5482.     codecConditionFirstBand                                            = $1;                {first band in frame}
  5483.     codecConditionLastBand                                            = $2;                {last band in frame}
  5484.     codecConditionFirstFrame                                            = $4;                {(input) first frame to be }
  5485.                                                                 { decompressed in this }
  5486.                                                                 { sequence}
  5487.     codecConditionNewDepth                                            = $8;                {(input) depth of }
  5488.                                                                 { destination}
  5489.     codecConditionNewTransform                                            = $10;                {(input) transformation }
  5490.                                                                 { matrix has changed}
  5491.     codecConditionNewSrcRect                                            = $20;                {(input) source rectange}
  5492.     codecConditionNewMask                                            = $40;                {(input) mask bitmap }
  5493.                                                                 { has changed}
  5494.     codecConditionNewMatte                                            = $80;                {(input) matte pixel map)
  5495.     codecConditionNewTransferMode                                            = $100;                {(input) transfer mode}
  5496.     codecConditionNewClut                                            = $200;                {(input) color lookup table}
  5497.     codecConditionNewAccuracy                                            = $400;                {accuracy parameter has }
  5498.                                                                 { changed}
  5499.     codecConditionNewDestination                                            = $800;                {(input) destination pixel }
  5500.                                                                 { map}
  5501.     codecConditionCodecChangedMask                                            = $80000000;    {changed mask bits}
  5502.     {CodecInfo compressFlags and deCompressFlags bits}
  5503.     codecInfoDoes1                                    = $1;            {works with 1-bit pixel maps}
  5504.     codecInfoDoes2                                     = $2;            {works with 2-bit pixel maps}
  5505.     codecInfoDoes4                                     = $4;            {works with 4-bit pixel maps}
  5506.     codecInfoDoes8                                     = $8;            {works with 8-bit pixel maps}
  5507.     codecInfoDoes16                                     = $10;            {works with 16-bit pixel maps}
  5508.     codecInfoDoes32                                     = $20;            {works with 32-bit pixel maps}
  5509.     codecInfoDoesDither                                     = $40;            {supports fast dithering}
  5510.     codecInfoDoesStretch                                     = $80;            {stretches to arbitrary sizes}
  5511.     codecInfoDoesShrink                                     = $100;            {shrinks to arbitrary sizes}
  5512.     codecInfoDoesMask                                     = $200;            {handles clipping regions}
  5513.     codecInfoDoesTemporal                                    = $400;            {sequential temporal }
  5514.                                                     { compression}
  5515.     codecInfoDoesDouble                                     = $800;            {stretches to double size}
  5516.     codecInfoDoesQuad                                     = $1000;            {stretches to quadruple size}
  5517.     codecInfoDoesHalf                                     = $2000;            {shrinks to half size}
  5518.     codecInfoDoesQuarter                                     = $4000;            {shrinks to one-quarter size}
  5519.     codecInfoDoesRotate                                     = $8000;            {rotates during decompression}
  5520.     codecInfoDoesHorizFlip                                    = $10000;    {flips horizontally}
  5521.     codecInfoDoesVertFlip                                     = $20000;            {flips vertically}
  5522.     codecInfoDoesSkew                                     = $40000;            {skews image during }
  5523.                                                     { decompression}
  5524.     codecInfoDoesBlend                                     = $80000;            {blends image with matte }
  5525.                                                     { during decompression}
  5526.     codecInfoDoesWarp                                     = $100000;            {warps image during }
  5527.                                                     { decompression}
  5528.     codecInfoDoesRecompress                                    = $200000;            {recompresses images}
  5529.     codecInfoDoesSpool                                    = $400000;            {uses data-loading }
  5530.                                                     { or unloading functions}
  5531.     codecInfoDoesRateConstrain                                    = $800000;        {constrains amount of generated }
  5532.                                                     { data to caller-defined limit}
  5533.     {codecInfo formatFlags bits}
  5534.     codecInfoDepth1                                     = $1;            {color images with 1-bit color depth}
  5535.     codecInfoDepth2                                     = $2;            {color images with 2-bit color depth}
  5536.     codecInfoDepth4                                     = $4;            {color images with 4-bit color depth}
  5537.     codecInfoDepth8                                     = $8;            {color images with 8-bit color depth}
  5538.     codecInfoDepth16                                     = $10;            {color images with 16-bit color depth}
  5539.     codecInfoDepth32                                     = $20;            {color images with 32-bit color depth}
  5540.     codecInfoDepth24                                     = $40;            {color images with 24-bit color depth}
  5541.     codecInfoDepth33                                     = $80;            {monochrome images with 1-bit  color }
  5542.                                                     { depth}
  5543.     codecInfoDepth34                                     = $100;            {grayscale images with 2-bit }
  5544.                                                     { grayscale depth}
  5545.     codecInfoDepth36                                     = $200;            {grayscale images with 4-bit }
  5546.                                                     { grayscale depth}
  5547.     codecInfoDepth40                                     = $400;            {grayscale images with 8-bit }
  5548.                                                     { grayscale depth}
  5549.     codecInfoStoresClut                                     = $800;            {custom color tables}
  5550.     codecInfoDoesLossless                                     = $1000;            {lossless compression or }
  5551.                                                     { decompression operations}
  5552.     codecInfoSequenceSensitive = $2000; {compression data requires non-key }
  5553.                                                     { frames to be decompressed in same }
  5554.                                                     { order as compressed}
  5555. Data Types
  5556.  
  5557. TYPE        CodecCapabilities = 
  5558.         RECORD
  5559.             flags:                        LongInt;                {control information}
  5560.             wantedPixelSize:                         Integer;                {pixel depth for component to use }
  5561.                                                     { with image}
  5562.             extendWidth:                         Integer;                {extension width of image}
  5563.             extendHeight:                         Integer;                {extension height of image}
  5564.             bandMin:                         Integer;                {supported minimum band height}
  5565.             bandInc:                         Integer;                {common factor of band heights}
  5566.             pad:                         Integer;                {reserved}
  5567.             time:                         Integer;                {milliseconds to completion}    
  5568.         END;
  5569.         
  5570.         CodecCapabilitiesPtr                                            =^CodecCapabilities;
  5571.         CodecCompressParams = 
  5572.         RECORD
  5573.             sequenceID:                            ImageSequence;                    {sequence identifier ID}
  5574.             imageDescription:                             ImageDescriptionHandle;
  5575.                                                             {handle to image }
  5576.                                                             { description record}
  5577.             data    :                         Ptr;                    {location for receipt of }
  5578.                                                             { compressed image data}
  5579.             bufferSize            :                 LongInt;                    {size of buffer for data}
  5580.             frameNumber:                             LongInt;                    {frame identifier}
  5581.             startLine:                             LongInt;                    {starting line for band}
  5582.             stopLine:                             LongInt;                    {ending line for band}
  5583.             conditionFlags:                             LongInt;                    {condition flags}
  5584.             callerFlags:                             CodecFlags;                    {control information flags}
  5585.  
  5586.             capabilities:                             CodecCapabilitiesPtr;
  5587.                                                             {pointer to compressor }
  5588.                                                             { capability record
  5589.             progressProcRecord:                            ProgressProcRecord;
  5590.                                                             {progress function record}
  5591.             completionProcRecord:                            CompletionProcRecord;    
  5592.                                                             {completion function }
  5593.                                                             { record}
  5594.             flushProcRecord:                             FlushProcRecord;
  5595.                                                             {data-unloading function }    
  5596.                                                             { record}
  5597.             srcPixMap:                            PixMap;                    {pointer to image}
  5598.             prevPixMap:                            PixMap;                    {pointer to pixel map }
  5599.                                                             { for previous image}
  5600.             spatialQuality:                             CodecQ;                    {compressed image quality}
  5601.             temporalQuality:                             CodecQ;                    {sequence temporal quality}
  5602.             similarity:                             Fixed;                    {similarity between }
  5603.                                                             { adjacent frames}
  5604.             dataRateParams                            dataRateParamsPtr;
  5605.                                                             {pointer to the data rate }
  5606.                                                             { parameters record}
  5607.             reserved:                             ARRAY[0..1] OF LongInt;        
  5608.                                                             {reserved}
  5609.     END;
  5610.  
  5611.     CodecCompressParamsPtr                                             = ^CodecCompressParams;
  5612.     CodecDecompressParams = 
  5613.     RECORD
  5614.         sequenceID:                                ImageSequence;                    {unique sequence ID}
  5615.         imageDescription:                                ImageDescriptionHandle;
  5616.                                                             {handle to image }                    
  5617.                                                             { description record}
  5618.         data:                                Ptr;                    {compressed image data}
  5619.         bufferSize:                                LongInt;                    {size of data buffer}
  5620.         frameNumber:                                LongInt;                    {frame identifier}
  5621.         startLine:                                LongInt;                    {starting line for band}
  5622.         stopLine:                                LongInt;                    {ending line for band}
  5623.         conditionFlags:                                LongInt;                    {condition flags}
  5624.         callerFlags:                                CodecFlags;                    {control flags}
  5625.         capabilities:                                CodecCapabilitiesPtr;
  5626.                                                             {pointer to compressor }
  5627.                                                             { capability record}
  5628.  
  5629.         progressProcRecord:                                ProgressProcRecord;
  5630.                                                             {progress function record}
  5631.         completionProcRecord:                                CompletionProcRecord;
  5632.                                                             {completion function record}
  5633.         dataProcRecord:                                DataProcRecord;    {data-loading function }
  5634.                                                             { record}
  5635.         port:                                CGrafPtr;                    {pointer to color }
  5636.                                                             { grafport for image}
  5637.         dstPixMap:                                PixMap;                    {destination pixel map}
  5638.         maskBits:                                BitMapPtr;                    {update mask}
  5639.         mattePixMap:                                PixMapPtr;                    {blend matte pixel map}
  5640.         srcRect:                                Rect;                    {source rectangle}
  5641.         matrix:                                MatrixRecordPtr;
  5642.                                                             {pointer to matrix }
  5643.                                                             { structure}
  5644.         accuracy:                                CodecQ;                    {desired accuracy}
  5645.         transferMode:                                Integer;                    {transfer mode}
  5646.         reserved:                                ARRAY[0..1] OF LongInt;
  5647.                                                             {reserved}
  5648.     END;
  5649.     CodecDecompressParamsPtr                                             = ^CodecDecompressParams;
  5650.  
  5651.     ProgressProcRecordPtr                                             = ^ProgressProcRecord;
  5652.     ProgressProcRecord                         = 
  5653.     RECORD
  5654.         progressProc:                         ProgressProcPtr;                        {pointer to progress function}
  5655.         progressRefCon:                        LongInt;                        {progress function }
  5656.                                                         { reference constant}
  5657.     END;
  5658.     
  5659.     CompletionProcRecordPtr                                                 = ^CompletionProcRecord;
  5660.     CompletionProcRecord                             = 
  5661.     RECORD
  5662.         completionProc:                         CompletionProcPtr;{pointer to completion function}
  5663.         completionRefCon:                        LongInt;                        {completion function reference }
  5664.                                                         { constant}
  5665.     END;
  5666.     
  5667.     DataProcRecordPtr                             = ^DataProcRecord;
  5668.     DataProcRecord = 
  5669.     RECORD
  5670.         dataProc:                     DataProcPtr;                        {pointer to data-loading function}
  5671.         dataRefCon:                     LongInt;                        {data-loading function }
  5672.                                                     { reference constant}
  5673.         END;
  5674.     
  5675.     FlushProcRecordPtr                             = ^FlushProcRecord;
  5676.     FlushProcRecord = 
  5677.     RECORD
  5678.         flushProc:                    FlushProcPtr;                        {pointer to data-unloading function}
  5679.         flushRefCon:                     LongInt;                        {data-unloading function reference }
  5680.                                                     { constant}
  5681.     END;
  5682. Routines
  5683.  
  5684. Direct Functions
  5685. FUNCTION CDGetCodecInfo    (VAR info: CodecInfo): ComponentResult;
  5686. FUNCTION CDGetMaxCompressionSize 
  5687. (src: PixMapHandle; srcRect: Rect; 
  5688. depth: Integer; quality: CodecQ; 
  5689. VAR size: LongInt): ComponentResult;
  5690. FUNCTION CDGetCompressionTime 
  5691. (src: PixMapHandle; srcRect: Rect; 
  5692. depth: Integer; VAR spatialQuality: CodecQ; VAR temporalQuality: CodecQ; 
  5693. VAR time: LongInt): ComponentResult;
  5694. FUNCTION CDGetSimilarity     (src: PixMapHandle; srcRect: Rect; 
  5695. desc: ImageDescriptionHandle; data: Ptr; 
  5696. VAR similarity: Fixed): ComponentResult;
  5697. FUNCTION CDGetCompressedImageSize 
  5698. (desc: ImageDescriptionHandle; data: Ptr; bufferSize: LongInt; 
  5699. dataProc: DataProcRecordPtr; 
  5700. VAR dataSize: LongInt): ComponentResult;
  5701. FUNCTION CDTrimImage     (desc: ImageDescriptionHandle; inData: Ptr; inBufferSize: LongInt; 
  5702. dataProc: DataProcRecordPtr; outData: Ptr; outBufferSize: LongInt; 
  5703. flushProc: FlushProcRecordPtr; 
  5704. VAR trimRect: Rect; 
  5705. progressProc: ProgressProcRecordPtr): ComponentResult;
  5706. FUNCTION CDCodecBusy     (seq: ImageSequence): ComponentResult;
  5707. Indirect Functions
  5708. FUNCTION CDPreCompress     (params: CodecCompressParamsPtr): ComponentResult;
  5709. FUNCTION CDBandCompress     (params: CodecCompressParamsPtr): ComponentResult;
  5710. FUNCTION CDPreDecompress     (params: CodecCompressParamsPtr): ComponentResult;
  5711. FUNCTION CDBandDecompress     (params: CodecCompressParamsPtr): ComponentResult;
  5712. Image Compression Manager Utility Functions
  5713.  
  5714. FUNCTION SetImageDescriptionExtension 
  5715. (desc: ImageDescriptionHandle; 
  5716. extension: Handle; idType: LongInt): OSErr;
  5717. FUNCTION GetImageDescriptionExtension 
  5718. (desc: ImageDescriptionHandle; 
  5719. VAR extension: Handle; idType: LongInt; 
  5720. index: LongInt): OSErr;
  5721. FUNCTION RemoveImageDescriptionExtension
  5722. (desc: ImageDescriptionHandle; idType: LongInt; index: LongInt): OSErr;
  5723. FUNCTION CountImageDescriptionExtensionType
  5724. (desc: ImageDescriptionHandle; idType: LongInt; VAR count: LongInt): OSErr;
  5725. FUNCTION GetNextImageDescriptionExtensionType
  5726. (desc: ImageDescriptionHandle; 
  5727. VAR idType: LongInt): OSErr;
  5728. codecErr    –8960    General error returned by compressor; can be returned by any function that gets handled by the compressor    
  5729. noCodecErr    –8961    Image Compression Manager could not find specified error    
  5730. codecUnimpErr    –8962    Feature not implemented by this compressor    
  5731. codecSpoolErr    –8966    Error loading or unloading data    
  5732. codecAbortErr    –8967    Operation aborted by progress function    
  5733. codecExtensionNotFoundErr    –8971    Requested extension is not in the image description structure    
  5734. codecOpenErr    –8973    Compressor component could not be opened by the Image Compression Manager    
  5735. Result Codes
  5736. Listing 5-0
  5737. Table 5-0
  5738. Sequence Grabber Components
  5739. Contents
  5740. About Sequence Grabber Components5-3
  5741. Using Sequence Grabber Components5-5
  5742. Previewing and Recording Captured Data5-9
  5743. Previewing5-9
  5744. Recording5-10
  5745. Playing Captured Data and Saving It in a QuickTime Movie5-11
  5746. Initializing a Sequence Grabber Component5-11
  5747. Creating a Sound Channel and a Video Channel5-12
  5748. Previewing Sound and Video Sequences in a Window5-14
  5749. Capturing Sound and Video Data5-18
  5750. Setting Up the Video Bottleneck Functions5-19
  5751. Drawing Information Over Video Frames During Capture5-20
  5752. Sequence Grabber Components Reference5-22
  5753. Data Types5-22
  5754. The Compression Information Structure5-22
  5755. The Frame Information Structure5-23
  5756. Sequence Grabber Component Functions5-24
  5757. Configuring Sequence Grabber Components5-24
  5758. Controlling Sequence Grabber Components5-36
  5759. Working With Sequence Grabber Settings5-47
  5760. Working With Sequence Grabber Characteristics5-53
  5761. Working With Channel Characteristics5-58
  5762. Working With Channel Devices5-72
  5763. Working With Video Channels5-77
  5764. Working With Sound Channels5-92
  5765. Video Channel Callback Functions5-99
  5766. Utility Functions for Video Channel Callback Functions5-102
  5767. Application-Defined Functions5-111
  5768. Summary of Sequence Grabber Components5-123
  5769. C Summary5-123
  5770. Constants5-123
  5771. Data Types5-127
  5772. Sequence Grabber Component Functions5-129
  5773. Application-Defined Functions5-135
  5774. Pascal Summary5-136
  5775. Constants5-136
  5776. Data Types5-140
  5777. Sequence Grabber Component Routines5-141
  5778. Application-Defined Routines5-148
  5779. Result Codes5-149
  5780. Sequence Grabber Components
  5781. This chapter discusses sequence grabber components. Sequence grabber components allow applications to obtain digitized data from external sources. Applications can then request that the sequence grabber display that data or store it in QuickTime movie files. If you are writing an application that needs to acquire data from sources external to the Macintosh computer, or if you are developing a sequence grabber channel component, you should read this chapter. If you are developing a channel component, you should also read the chapter “Sequence Grabber Channel Components.”
  5782. Note that the information in this chapter is presented from the perspective of a developer of an application that uses sequence grabber components. If you 
  5783. are developing a sequence grabber component, your component must support the interfaces described in this chapter.
  5784. This chapter has been divided into the following sections:
  5785. n    “About Sequence Grabber Components” presents general information about sequence grabber components.
  5786. n    “Using Sequence Grabber Components” discusses how to use the sequence grabber component to preview and record captured data. It then provides a sample program that shows how to play captured data and save it in a QuickTime movie.
  5787. n    “Sequence Grabber Components Reference” describes the constants and data structures that an application needs to communicate with sequence grabber components as well as the functions that your sequence grabber component must support.
  5788. n    “Summary of Sequence Grabber Components” supplies a summary of the sequence grabber component constants, data types, and functions in C and in Pascal.
  5789.  
  5790. About Sequence Grabber Components
  5791.  
  5792. Sequence grabber components allow applications to obtain digitized data from sources that are external to a Macintosh computer. For example, you can use a sequence grabber component to record video data from a video digitizer. Your application can then request that the sequence grabber store the captured video data in a QuickTime movie. In this manner, you can acquire movie data from various sources that can augment the movie data you create by other means, such as computer animation. You can also use sequence grabber components to obtain and display data from external sources, without saving the captured data in a movie.
  5793. The sequence grabber component provided by Apple allows applications to capture both audio and video data easily, without concern for the details of how the data is acquired. When capturing video data, this sequence grabber uses a video digitizer component to supply the digitized video images (see the chapter “Video Digitizer Components” in this book for more information about video digitizer components). When working with audio data, Apple’s sequence grabber component retrieves its sound data from a sound input device (see Inside Macintosh: More Macintosh Toolbox for more information about sound input devices).
  5794. Sequence grabber components use sequence grabber channel components (or, simply, channel components) to obtain data from the audio- or video-digitizing equipment. These components isolate the sequence grabber from the details of working with the various types of data that can be collected. The features that a sequence grabber component supplies are dependent on the services provided by sequence grabber channel components. The channel components, in turn, may use other components to interact with the digitizing equipment. For example, the video channel component supplied by Apple uses a video digitizer component. Figure 5-1 shows the relationship between these components and your application. 
  5795. Figure 5-1    Relationships among your application, a sequence grabber component, and channel components
  5796.  
  5797. Sequence grabber panel components augment the capabilities of sequence grabber components and sequence grabber channel components by allowing sequence grabbers to obtain configuration information from the user for a particular digitizing source. Sequence grabbers present a settings dialog box to the user whenever an application calls the SGSettingsDialog function (see “Working With Sequence Grabber Settings” beginning on page 5-47 for more information about this sequence grabber function). Applications never call sequence grabber panel components directly; application developers use panel components only by calling the sequence grabber component. See the chapter “Sequence Grabber Panel Components” in this book for more information about the sequence grabber configuration dialog box and the relationships of sequence grabbers, sequence grabber channels, and sequence grabber panels.
  5798. If you are developing digitizing equipment and you want to allow applications to use the services of your equipment with a sequence grabber component, you should create an appropriate video digitizer component or sound input device driver. See the chapter “Video Digitizer Components” later in this book for a description of video digitizer components. See Inside Macintosh: More Macintosh Toolbox for information about sound input device drivers.
  5799. If you are developing equipment that provides a new type of data to QuickTime, you should develop a new sequence grabber channel component. See the chapter “Sequence Grabber Channel Components” in this book for a complete description of sequence grabber channel components. 
  5800.  
  5801. Using Sequence Grabber Components
  5802.  
  5803. You can use the sequence grabber component to play captured data for the user or to save captured data in a QuickTime movie. The sequence grabber component provides functions that give your application precise control over the display of the captured data. 
  5804. This section describes how to use the basic sequence grabber component functions as well as the functions that allow you to configure video and sound channels.
  5805. Sequence grabber components are standard components that are managed by the Component Manager. See the chapter “Component Manager” in Inside Macintosh: More Macintosh Toolbox for more information about the Component Manager and about how to use components.
  5806. Apple has defined a component type value for sequence grabber components—that type value is 'barg'. You can use the following constant to specify this type value.
  5807. #define SeqGrabComponentType 'barg'                                                /* sequence grabber
  5808.                                                     component type */
  5809. Apple has defined a functional interface for basic sequence grabber components. For information about the functions a sequence grabber component may support, see “Sequence Grabber Component Functions,” which begins on page 5-24. 
  5810. You can use the following constants to refer to the request codes for each of the functions that a sequence grabber component may support.
  5811. enum {
  5812.     /* selectors for basic sequence grabber component functions */
  5813.     kSGInitializeSelect                                             = 0x1;             /* SGInitialize */
  5814.     kSGSetDataOutputSelect                                             = 0x2;            /* SGSetDataOutput */
  5815.     kSGGetDataOutputSelect                                             = 0x3;             /* SGGetDataOutput */
  5816.     kSGSetGWorldSelect                                             = 0x4;             /* SGSetGWorld */
  5817.     kSGGetGWorldSelect                                             = 0x5;            /* SGGetGWorld */                        
  5818.     kSGNewChannelSelect                                             = 0x6;             /* SGNewChannel */
  5819.     kSGDisposeChannelSelect                                             = 0x7;             /* SGDisposeChannel */
  5820.     kSGStartPreviewSelect                                             = 0x10;            /* SGStartPreview */
  5821.     kSGStartRecordSelect                                             = 0x11;             /* SGStartRecord */
  5822.     kSGIdleSelect                                             = 0x12;             /* SGIdle */
  5823.     kSGStopSelect                                             = 0x13;             /* SGStop */
  5824.     kSGPauseSelect                                             = 0x14;            /* SGPause */
  5825.     kSGPrepareSelect                                             = 0x15;             /* SGPrepare */
  5826.     kSGReleaseSelect                                             = 0x16;             /* SGRelease */
  5827.     kSGGetMovieSelect                                             = 0x17;             /* SGGetMovie */
  5828.     kSGSetMaximumRecordTimeSelect                                             = 0x18;             /* SGSetMaximumRecordTime */
  5829.     kSGGetMaximumRecordTimeSelect                                             = 0x19;            /* SGGetMaximumRecordTime */
  5830.     kSGGetStorageSpaceRemainingSelect                                            = 0x1a;             /* SGGetStorageSpaceRemaining */                
  5831.     kSGGetTimeRemainingSelect                                             = 0x1b;             /* SGGetTimeRemaining */                                    
  5832.     kSGGrabPictSelect                                             = 0x1c;             /* SGGrabPict */
  5833.     kSGGetLastMovieResIDSelect                                             = 0x1d;             /* SGGetLastMovieResID */
  5834.     kSGSetFlagsSelect                                             = 0x1e;             /* SGSetFlags */
  5835.     kSGGetFlagsSelect                                             = 0x1f;             /* SGGetFlags */
  5836.     kSGSetDataProcSelect                                             = 0x20;            /* SGSetDataProc */
  5837.     kSGNewChannelFromComponentSelect         = 0x21;                                                /* SGNewChannelFromComponent */
  5838.     kSGDisposeDeviceListSelect                                             = 0x22;            /* SGDisposeDeviceList */
  5839.     kSGAppendDeviceListToMenuSelect                                             = 0x23;            /* SGAppendDeviceListToMenu */
  5840.     kSGSetSettingsSelect                                             = 0x24;            /* SGSetSettings */
  5841.     kSGGetSettingsSelect                                             = 0x25;            /* SGGetSettings */
  5842.     kSGGetIndChannelSelect                                             = 0x26;            /* SGGetIndChannel */
  5843.     kSGUpdateSelect                                             = 0x27;            /* SGUpdate */
  5844.     kSGGetPauseSelect                                             = 0x28;            /* SGGetPause */
  5845.     kSGSettingsDialogSelect                                             = 0x29;            /* SGSettingsDialog */
  5846.     kSGGetAlignmentProcSelect                                             = 0x2A;            /* SGGetAlignmentProc */
  5847.     kSGSetChannelSettingsSelect                                             = 0x2B;            /* SGSetChannelSettings */
  5848.     kSGGetChannelSettingsSelect                                             = 0x2C;            /* SGGetChannelSettings */
  5849.  
  5850.     /* selectors for common channel configuration functions */
  5851.     kSGCSetChannelUsageSelect                                             = 0x80;             /* SGCSetChannelUsage */
  5852.     kSGCGetChannelUsageSelect                                             = 0x81;             /* SGCGetChannelUsage */
  5853.     kSGCSetChannelBoundsSelect                                             = 0x82;             /* SGCSetChannelBounds */
  5854.     kSGCGetChannelBoundsSelect                                             = 0x83;             /* SGCGetChannelBounds */
  5855.     kSGCSetChannelVolumeSelect                                             = 0x84;             /* SGCSetChannelVolume */
  5856.     kSGCGetChannelVolumeSelect                                             = 0x85;             /* SGCGetChannelVolume */
  5857.     kSGCGetChannelInfoSelect                                             = 0x86;             /* SGCGetChannelInfo */
  5858.     kSGCSetChannelPlayFlagsSelect                                             = 0x87;             /* SGCSetChannelPlayFlags */                                         
  5859.     kSGCGetChannelPlayFlagsSelect                                             = 0x88;             /* SGCGetChannelPlayFlags */
  5860.     kSGCSetChannelMaxFramesSelect                                             = 0x89;             /* SGCSetChannelMaxFrames */
  5861.     kSGCGetChannelMaxFramesSelect                                             = 0x8a;             /* SGCGetChannelMaxFrames */
  5862.     kSGCSetChannelRefConSelect                                             = 0x8b;             /* SGCSetChannelRefCon */
  5863.     kSGCSetChannelClipSelect                                             = 0x8C;             /* SGCSetChannelClip */
  5864.     kSGCGetChannelClipSelect                                             = 0x8D;             /* SGCGetChannelClip */
  5865.     kSGCGetChannelSampleDescriptionSelect = 0x8E;
  5866.                                                     /* SGCGetChannelSampleDescription */
  5867.     kSGCGetChannelDeviceListSelect                                             = 0x8F;            /* SGCGetChannelDeviceList */
  5868.     kSGCSetChannelDeviceSelect                                             = 0x90;            /* SGCSetChannelDevice */
  5869.     kSGCSetChannelMatrixSelect                                             = 0x91;            /* SGCSetChannelMatrix */
  5870.     kSGCGetChannelMatrixSelect                                             = 0x92;            /* SGCGetChannelMatrix */
  5871.     kSGCGetChannelTimeScaleSelect                                             = 0x93;            /* SGCGetChannelTimeScale */    
  5872.  
  5873.     /* selectors for video channel configuration functions */
  5874.     kSGCGetSrcVideoBoundsSelect                                             = 0x100;            /* SGCGetSrcVideoBounds */
  5875.     kSGCSetVideoRectSelect                                             = 0x101;            /* SGCSetVideoRect */
  5876.     kSGCGetVideoRectSelect                                             = 0x102;            /* SGCGetVideoRect */
  5877.     kSGCGetVideoCompressorTypeSelect                                         = 0x103;                /* SGCGetVideoCompressorType */
  5878.     kSGCSetVideoCompressorTypeSelect                                             = 0x104;            /* SGCSetVideoCompressorType */
  5879.     kSGCSetVideoCompressorSelect                                             = 0x105;            /* SGCSetVideoCompressor */
  5880.     kSGCGetVideoCompressorSelect                                             = 0x106;            /* SGCGetVideoCompressor */
  5881.     kSGCGetVideoDigitizerComponentSelect
  5882.                                                 = 0x107;
  5883.                                                         /* SGCGetVideoDigitizerComponent */
  5884.     kSGCSetVideoDigitizerComponentSelect
  5885.                                                 = 0x108; 
  5886.                                                         /* SGCSetVideoDigitizerComponent */
  5887.     kSGCVideoDigitizerChangedSelect                                             = 0x109; /* SGCVideoDigitizerChanged */
  5888.     kSGCSetVideoBottlenecksSelect                                            = 0x10a;            /* SGCSetVideoBottlenecks */
  5889.     kSGCGetVideoBottlenecksSelect                                             = 0x10b; /* SGCGetVideoBottlenecks */
  5890.     kSGCGrabFrameSelect                                             = 0x10c;            /* SGCGrabFrame */
  5891.     kSGCGrabFrameCompleteSelect                                             = 0x10d;            /* SGCGrabFrameComplete */
  5892.     kSGCDisplayFrameSelect                                             = 0x10e;            /* SGCDisplayFrame */
  5893.     kSGCCompressFrameSelect                                             = 0x10f;            /* SGCCompressFrame */
  5894.     kSGCCompressFrameCompleteSelect                                             = 0x110;            /* SGCCompressFrameComplete */
  5895.     kSGCAddFrameSelect                                             = 0x111;            /* SGCAddFrameSelect */
  5896.     kSGCTransferFrameForCompressSelect = 0x112; 
  5897.                                                         /* SGCTransferFrameForCompress */
  5898.     kSGCSetCompressBufferSelect                                             = 0x113;            /* SGCSetCompressBuffer */
  5899.     kSGCGetCompressBufferSelect                                             = 0x114;            /* SGCGetCompressBuffer */
  5900.     kSGCGetBufferInfoSelect                                             = 0x115; /* SGCGetBufferInfo */
  5901.     kSGCSetUseScreenBufferSelect                                             = 0x116; /* SGCSetUseScreenBuffer */
  5902.     kSGCGetUseScreenBufferSelect                                             = 0x117; /* SGCGetUseScreenBuffer */
  5903.     kSGCGrabCompressCompleteSelect                                             = 0x118; /* SGCGrabCompressComplete */
  5904.     kSGCDisplayCompressSelect                                             = 0x119; /* SGCDisplayCompress */
  5905.     kSGCSetFrameRateSelect                                             = 0x11A; /* SGCSetFrameRate */
  5906.     kSGCGetFrameRateSelect                                             = 0x11B; /* SGCGetFrameRate */     
  5907.  
  5908.     /* selectors for sound channel configuration functions */
  5909.     kSGCSetSoundInputDriverSelect                                              = 0x100;            /* SGCSetSoundInputDriver */
  5910.     kSGCGetSoundInputDriverSelect                                              = 0x101;            /* SGCGetSoundInputDriver */
  5911.     kSGCSoundInputDriverChangedSelect                                             = 0x102;            
  5912.                                                     /* SGCSoundInputDriverChanged */
  5913.     kSGCSetSoundRecordChunkSizeSelect                                             = 0x103;            
  5914.                                                     /* SGCSetSoundRecordChunkSize */
  5915.     kSGCGetSoundRecordChunkSizeSelect                                             = 0x104;    
  5916.                                                     /* SGCGetSoundRecordChunkSize */
  5917.     kSGCSetSoundInputRateSelect                                              = 0x105;     /* SGCSetSoundInputRate */
  5918.     kSGCGetSoundInputRateSelect                                              = 0x106;     /* SGCGetSoundInputRate */
  5919.     kSGCSetSoundInputParametersSelect                                             = 0x107; 
  5920.                                                     /* SGCSetSoundInputParameters */
  5921.     kSGCGetSoundInputParametersSelect                                             = 0x108;
  5922.                                                     /* SGCGetSoundInputParameters */    
  5923.     /* selectors for utility functions provided to channel components */
  5924.     kSGWriteMovieData                                             = 0x100; /* SGWriteMovieData */
  5925.     kSGAddFrameReferenceSelect                                             = 0x101; /* SGAddFrameReference */
  5926.     kSGGetNextFrameReferenceSelect                                             = 0x102; /* SGGetNextFrameReference */
  5927.     kSGGetTimeBaseSelect                                             = 0x103; /* SGGetTimeBase */
  5928.     kSGSortDeviceListSelect                                             = 0x104; /* SGSortDeviceList */
  5929.     kSGAddMovieDataSelect                                             = 0x105; /* SGAddMovieData */
  5930.     kSGChangedSourceSelect                                             = 0x106; /* SGChangedSource */
  5931. };
  5932. Previewing and Recording Captured Data
  5933.  
  5934. You can use sequence grabber components in two ways: to play digitized data for the user or to save captured data in a QuickTime movie. The process of displaying data that is to be captured is called previewing; saving captured data in a movie is called recording. You can use previewing to allow the user to prepare to make a recording. If you do so, your application can move directly from the preview operation to a record operation, without stopping the process.
  5935. Previewing
  5936.  
  5937. Previewing captured data involves playing that data for the user as it is captured. For video data, this means displaying the video images on the computer screen. For audio data, this means playing the sound through the computer’s sound system. The following paragraphs outline the steps you must follow to preview captured data.
  5938.     1.    First, you must open a connection to the sequence grabber component. Use the Component Manager’s OpenDefaultComponent or OpenComponent function.
  5939.     2.    Once you have a connection to a sequence grabber component, you must configure the component for the preview operation. Use the SGSetGWorld function (described on page 5-29) to set the graphics world in which the preview is to be displayed. Allocate the appropriate channels by calling the SGNewChannel function (described on page 5-31). You must call this function once for each channel to be used by the sequence grabber component. Use the SGSetChannelUsage function (described on page 5-59) to specify that each channel is to be used for previewing. You can then use the appropriate channel configuration functions to prepare the channel for the preview operation. For video channels, use the functions discussed in “Working With Video Channels” beginning on page 5-77. For sound channels, use the functions discussed in “Working With Sound Channels” beginning on page 5-92.
  5940.     3.    You start the preview operation by calling the SGStartPreview function (see page 5-37). The sequence grabber component then begins collecting data from the channels that you have created and plays that data appropriately. You can pause and restart the preview by calling the SGPause function (see page 5-41). Use the SGStop function (see page 5-40) to stop the preview. During the preview operation, be sure to call the SGIdle function (see page 5-39) frequently, so that the sequence grabber and its channels can perform the operation.
  5941.     4.    When you are done previewing, you can start recording or close your connection to the sequence grabber component. When you close the sequence grabber component, it automatically disposes of the channels you created. 
  5942. See the sample program in Listing 5-1 on page 5-11 for an example of the preview operation.
  5943. Recording
  5944.  
  5945. During a record operation, a sequence grabber component collects the data it captures and formats that data into a QuickTime movie. During a record operation, the sequence grabber can also play the captured data for the user. However, the sequence grabber tries to prevent the playback from interfering with the quality of the recording process.
  5946. The following paragraphs discuss the steps you must follow to record captured data.
  5947.     1.    As with a preview operation, your application must establish a 
  5948. connection to a sequence grabber component. Use the Component 
  5949. Manager’s OpenDefaultComponent or OpenComponent function.
  5950.     2.    Once you have a connection to a sequence grabber component, you must configure the component for the record operation. Use the SGSetGWorld function (see page 5-29) to set the graphics world in which the data is to be displayed. Allocate the appropriate channels by calling the SGNewChannel function (see page 5-31). You must call this function once for each channel to be used by the sequence grabber component. Use the SGSetChannelUsage function (see page 5-59) to specify that each channel is to be used for recording. At this time, you can specify whether the sequence grabber is to play that channel’s data while recording. You can then use the appropriate channel configuration functions to prepare the channel for the record operation. For video channels, use the functions discussed in “Working With Video Channels” beginning on page 5-77. For sound channels, use the functions discussed in “Working With Sound Channels” beginning on page 5-92. 
  5951.     3.    You must specify a movie file for use by the sequence grabber during the record operation. Use the SGSetDataOutput function (see page 5-26) to specify this movie file. This function also allows you to control whether the sequence grabber adds the movie resource to the movie file and whether it replaces existing data or appends the new movie to the file.
  5952.     4.    You can limit the amount of data that is captured during a record operation. The  SGSetMaximumRecordTime function (see page 5-53) establishes a time limit for the record operation. The SGSetChannelMaxFrames function (see page 5-63) limits the number of frames of data that the sequence grabber collects from a specific channel.
  5953.     5.    You start the record operation by calling the SGStartRecord function (see page 5-38). The sequence grabber component then begins collecting data from the channels you have created, stores the data in a QuickTime movie, and, optionally, plays that data appropriately. You can pause and restart the record process by calling the SGPause function (see page 5-41). During the record operation, be sure to call the SGIdle function (see page 5-39) frequently, so that the sequence grabber and its channels can perform the operation. Use the SGStop function (see page 5-40) to stop recording. At this time, the sequence grabber saves the movie in your movie file, if you have chosen to do so.
  5954.     6.    When you are done recording, you can go back to previewing or close your connection to the sequence grabber component. When you close the sequence grabber component, it automatically disposes of the channels you created as well as any movies it has created.
  5955. Playing Captured Data and Saving It in a QuickTime Movie
  5956.  
  5957. This section supplies a sample program that shows how to use a sequence grabber component to preview and record captured data. The program is divided into groups of functions that do the following tasks: 
  5958. n    initialization
  5959. n    video and sound channel creation
  5960. n    sequence preview
  5961. n    capture of sound and video sequences
  5962. n    drawing over video frames during a capture operation
  5963. Initializing a Sequence Grabber Component
  5964.  
  5965. Listing 5-1 provides a sample function that creates and initializes a default sequence grabber component for a specified window (using the OpenDefaultComponent and SGInitialize functions, respectively). It then sets the graphics world of the sequence grabber component to the specified window with the SGSetGWorld function. Note that the CloseComponent function is called for housekeeping purposes in case the sequence grabber component fails. For more on OpenDefaultComponent and CloseComponent, see the chapter “Component Manager” in Inside Macintosh: More Macintosh Toolbox. For details on SGInitialize and SGSetGWorld, see page 5-25 and page 5-29, respectively.
  5966. Listing 5-1    Initializing a sequence grabber component
  5967.  
  5968. SeqGrabComponent MakeSequenceGrabber (WindowPtr aWindow)
  5969. {
  5970.     SeqGrabComponent anSG;
  5971.     OSErr err = noErr;
  5972.  
  5973.     /* open up the default sequence grabber */
  5974.     anSG = OpenDefaultComponent (SeqGrabComponentType, 0);
  5975.     if (anSG) {
  5976.         /* initialize the default sequence grabber component */
  5977.         err = SGInitialize (anSG);
  5978.         if (!err) {
  5979.         /* set the sequence grabber's graphics world to the 
  5980.             specified window */
  5981.             err = SGSetGWorld (anSG, (CGrafPtr) aWindow, nil);
  5982.         }
  5983.     }
  5984.     if (err && anSG) {
  5985.         /* clean up on failure */
  5986.         CloseComponent (anSG);
  5987.         anSG = nil;
  5988.     }
  5989.     return anSG;
  5990. }
  5991. Creating a Sound Channel and a Video Channel
  5992.  
  5993. Listing 5-2 supplies a sample function that attempts to create a video channel and a sound channel for the sequence grabber component that was created in Listing 5-1. The boundaries of the video channel are set to the specifications of the bounds parameter. The channel’s usage is always set to allow previewing. If the value of the willRecord parameter is true, then the usage of the channel is set to allow recording also. 
  5994. The SGNewChannel function (described on page 5-31) uses the VideoMediaType constant to create a video channel and the SoundMediaType constant to create a sound channel. The SGSetChannelBounds function (described on page 5-65) specifies the boundaries of the video channel. The SGSetChannelUsage function (described on page 5-59) specifies whether the video and the sound channels are used for preview or record operations. The SGDisposeChannel function (described on page 5-34) cleans up upon failure for each of the channels.
  5995. Listing 5-2    Creating a sound channel and a video channel
  5996.  
  5997. void MakeGrabChannels (SeqGrabComponent anSG, 
  5998.                                 SGChannel *videoChannel, 
  5999.                                 SGChannel *soundChannel,
  6000.                                 const Rect *bounds, Boolean willRecord)
  6001. {
  6002.     OSErr err;
  6003.     long usage;
  6004.     /* figure out the usage */
  6005.     usage = seqGrabPreview;                                        /* always previewing */
  6006.     if (willRecord)
  6007.         usage |= seqGrabRecord;                                    /* sometimes recording */
  6008.     /* create a video channel */
  6009.     err = SGNewChannel (anSG, VideoMediaType, videoChannel);
  6010.     if (!err) {
  6011.  
  6012.     /* set boundaries for new video channel */
  6013.         err = SGSetChannelBounds (*videoChannel, bounds);
  6014.     /* set usage for new video channel */
  6015.         if (!err)
  6016.             err = SGSetChannelUsage (*videoChannel, 
  6017.                                             usage | seqGrabPlayDuringRecord);
  6018.         if (err) {
  6019.  
  6020.             /* clean up on failure */
  6021.             SGDisposeChannel (anSG, *videoChannel);
  6022.             *videoChannel = nil;
  6023.         }
  6024.     }
  6025.     /* create a sound channel */
  6026.     err = SGNewChannel (anSG, SoundMediaType, soundChannel);
  6027.     if (!err) {
  6028.  
  6029.         /* set usage of new sound channel */
  6030.         err = SGSetChannelUsage (*soundChannel, usage);
  6031.         if (err) {
  6032.  
  6033.             /* clean up on failure */
  6034.             SGDisposeChannel(anSG, *soundChannel);
  6035.             *soundChannel = nil;
  6036.         }
  6037.     }
  6038. }
  6039. Previewing Sound and Video Sequences in a Window
  6040.  
  6041. Listing 5-3 shows how to use the sequence grabber component to preview sound and video sequences in a window. Clicking the content area of the window causes the sequence grabber to pause until the mouse button is released. 
  6042. The Image Compression Manager’s GetBestDeviceRect function helps you determine the best monitor for the window. The SGStartPreview function (described on page 5-37) begins the preview of the sound and video sequences. The SGIdle function (described on page 5-39) grants the sequence grabber component the time it needs to preview data. The SGUpdate function (described on page 5-39) informs the sequence grabber of the update event. The Window Manager’s BeginUpdate and EndUpdate functions respond to the event. The SGPause function (described on page 5-41) instructs the sequence grabber to suspend and resume its preview operation. In this example, it is used to suspend the preview operation while the mouse button is held down. Finally, the SGStop function (described on page 5-40) halts the action of the sequence grabber component. The Component Manager’s CloseComponent function closes the component connection. The Window Manager’s DisposeWindow function disposes of the window.
  6043. Listing 5-3    Previewing sound and video sequences in a window
  6044.  
  6045. void CheckError(OSErr error, Str255 displayString)
  6046. {
  6047.     if (error == noErr) return;
  6048.     if (displayString[0] > 0) 
  6049.         DebugStr(displayString);
  6050.     ExitToShell();
  6051. }
  6052.  
  6053. Boolean IsQuickTimeInstalled (void) 
  6054. {
  6055.     short            error;
  6056.     long            result;
  6057.     error = Gestalt (gestaltQuickTime, &result);
  6058.     return (error == noErr);
  6059. }
  6060.  
  6061. void initialize (void)
  6062. {
  6063.     OSErr err;
  6064.     InitGraf (&qd.thePort);
  6065.     InitFonts ();
  6066.     InitWindows ();
  6067.     InitMenus ();
  6068.     TEInit ();
  6069.     InitDialogs (nil);
  6070.     MaxApplZone();
  6071.  
  6072.     if (!IsQuickTimeInstalled())
  6073.         CheckError(-1,"\pPlease install QuickTime and try again.");
  6074.  
  6075.     err = EnterMovies ();
  6076.     CheckError(err,"\pUnable to initialize Movie Toolbox.");
  6077. }
  6078. WindowPtr makeWindow(void)
  6079. {
  6080.     WindowPtr aWindow;
  6081.     Rect windowRect = {0, 0, 120, 160};
  6082.     Rect bestRect;
  6083.  
  6084.     /* figure out the best monitor for the window */
  6085.     GetBestDeviceRect (nil, &bestRect);
  6086.  
  6087.     /* put the window in the top left corner of that monitor */
  6088.     OffsetRect(&windowRect, bestRect.left + 10, bestRect.top + 50);
  6089.  
  6090.     /* create the window */
  6091.     aWindow = NewCWindow (nil, &windowRect, "\pGrabber",
  6092.                                  true, noGrowDocProc, (WindowPtr)-1,
  6093.                                  true, 0);
  6094.  
  6095.     /* and set the port to the new window */
  6096.     SetPort(aWindow);
  6097.  
  6098.     return aWindow;
  6099. }
  6100. main (void)
  6101. {
  6102.     WindowPtr theWindow;
  6103.     SeqGrabComponent theSG;
  6104.     SGChannel videoChannel, soundChannel;
  6105.     Boolean done = false;
  6106.     OSErr err;
  6107.  
  6108.     initialize();
  6109.     theWindow = makeWindow();
  6110.     theSG = makeSequenceGrabber(theWindow);
  6111.     if (!theSG) return;
  6112.  
  6113.     makeGrabChannels(theSG, &videoChannel, &soundChannel,
  6114.                          &theWindow->portRect, false);
  6115.     if ((videoChannel == nil) && (soundChannel == nil))
  6116.         CheckError(-1,"\pNo sound or video available.");
  6117.  
  6118.     err = SGStartPreview(theSG);
  6119.     CheckError(err, "\pCan't start preview");
  6120.  
  6121.     while (!done) {
  6122.         AlignmentProcRecord alignProc;
  6123.         short part;
  6124.         WindowPtr whichWindow;
  6125.         EventRecord theEvent;
  6126.         GetNextEvent(everyEvent, &theEvent);
  6127.  
  6128.         switch (theEvent.what) {
  6129.             case nullEvent:                        /* give the sequence grabber time */
  6130.                     err = SGIdle (theSG);
  6131.                     if (err) done = true;
  6132.                     break;
  6133.  
  6134.             case updateEvt:    if (theEvent.message == (long)theWindow) {
  6135.                                     /* inform the sequence grabber of the
  6136.                                         update */
  6137.                 SGUpdate(theSG,((WindowPeek)
  6138.                                      theWindow)->updateRgn);
  6139.                 /* and swallow the update event */
  6140.                 BeginUpdate(theWindow);
  6141.                 EndUpdate(theWindow);
  6142.             }
  6143.             break;
  6144.             
  6145.             case mouseDown:    part = FindWindow (theEvent.where, 
  6146.                                                         &whichWindow);
  6147.                     if (whichWindow != theWindow) break;
  6148.                     switch (part) {
  6149.                         case inContent:
  6150.                             /* pause until mouse button is 
  6151.                                 released */
  6152.                             SGPause (theSG, true);
  6153.                             while (StillDown())
  6154.                             ;
  6155.                             SGPause(theSG, false);
  6156.                             break;
  6157.                         case inGoAway:
  6158.                             done = TrackGoAway (theWindow,
  6159.                                                     theEvent.where);
  6160.                             break;
  6161.                         case inDrag:
  6162.                             /* pause when dragging window so video 
  6163.                                 doesn't draw in the wrong place */
  6164.                             SGPause (theSG, true);
  6165.                             SGGetAlignmentProc (theSG, &alignProc);
  6166.                             DragAlignedWindow (theWindow,
  6167.                                                      theEvent.where,
  6168.                                                      &screenBits.bounds,
  6169.                                                      nil, &alignProc);
  6170.                             SGPause (theSG, false);
  6171.                             break;
  6172.                         }
  6173.                         break;
  6174.         }
  6175.     }
  6176.     /* clean up */
  6177.     SGStop (theSG);
  6178.     CloseComponent (theSG);
  6179.     DisposeWindow (theWindow);
  6180. }
  6181. Capturing Sound and Video Data
  6182.  
  6183. Listing 5-4 uses the sequence grabber component to capture ten seconds of 
  6184. sound and video data. It prompts the user for the name of the file to create. The SGSettingsDialog function (described on page 5-48) is issued to invoke the default sound and video capture settings dialog boxes. These default dialog boxes allow the user to configure the settings for the capture operations. The SGSetMaximumRecordTime function (described on page 5-53) indicates how long the capture operations will last. The SGStartRecord function (described on page 5-38) specifies the time at which the capture operations will begin. The SGIdle function (described on page 5-39) grants the time needed to confirm the capture operations. Finally, the SGStop function (described on page 5-40) and the Window Manager’s DisposeWindow routine are called in order to complete the capture of the sequences.
  6185. Listing 5-4    Capturing sound and video
  6186.  
  6187. main (void)
  6188. {
  6189.     WindowPtr theWindow;
  6190.     CGrafPort tempPort;
  6191.     SeqGrabComponent theSG;
  6192.     SGChannel videoChannel, soundChannel;
  6193.     OSErr err;
  6194.  
  6195.     initialize();
  6196.     theWindow = makeWindow();
  6197.  
  6198.     theSG = makeSequenceGrabber(theWindow);
  6199.     if (!theSG) return;
  6200.     err = setGrabFile(theSG);
  6201.     CheckError(err, "\pNo output file");
  6202.  
  6203.     makeGrabChannels (theSG, &videoChannel, &soundChannel,
  6204.                              &theWindow->portRect, true);
  6205.     if ((videoChannel == nil) && (soundChannel == nil))
  6206.         CheckError(-1,"\pNo sound or video available.");
  6207.     if (videoChannel)
  6208.         SGSettingsDialog (theSG, videoChannel, 0, nil,
  6209.                                  DoTheRightThing, nil, 0);
  6210.     if (soundChannel)
  6211.         SGSettingsDialog(theSG, soundChannel, 0, nil,
  6212.                              DoTheRightThing, nil, 0);
  6213.  
  6214.     err = SGSetMaximumRecordTime(theSG, 10 * 60);
  6215.     CheckError(err, "\pCan't set max record time");
  6216.  
  6217.     err = SGStartRecord (theSG);
  6218.     CheckError(err, "\pCan't start record");
  6219.  
  6220.     while (!err)
  6221.         err = SGIdle (theSG);
  6222.     if (err == grabTimeComplete)
  6223.         err = noErr;
  6224.     CheckError(err, "\pError while recording");
  6225.  
  6226.     err = SGStop(theSG);
  6227.     CheckError(err, "\pError creating movie");
  6228.  
  6229.     CloseComponent(theSG);
  6230.     DisposeWindow(theWindow);
  6231. }
  6232. Setting Up the Video Bottleneck Functions
  6233.  
  6234. Listing 5-5 shows how to set up the video bottleneck functions of the sequence grabber video channel component. For more information on the video bottleneck functions, see “Utility Functions for Video Channel Callback Functions” beginning on page 5-102. Inside the main event loop in Listing 5-4, you should add the following lines after you call the SGSetMaximumRecordTime function (described on page 5-53).
  6235. Listing 5-5    Setting up the video bottleneck functions
  6236.  
  6237.     if (videoChannel) {
  6238.         err = setupVideoBottlenecks (videoChannel, theWindow,
  6239.                                              &tempPort);
  6240.         CheckError(err, "\pCouldn't set video bottlenecks");
  6241.     }
  6242. Drawing Information Over Video Frames During Capture
  6243.  
  6244. Listing 5-6 shows how to use the video bottleneck functions of the sequence grabber video channel component to draw the letters “QT” over each video frame as it is captured. 
  6245. Listing 5-6    Drawing information over video frames during capture
  6246.  
  6247. pascal ComponentResult myGrabFrameComplete (SGChannel c, 
  6248.                                                          short bufferNum,
  6249.                                                          Boolean *done, 
  6250.                                                          long refCon)
  6251. {
  6252.     ComponentResult err;
  6253.  
  6254.     /* call the default grab-complete function */
  6255.      err = SGGrabFrameComplete (c, bufferNum, done);
  6256.     if (*done) {
  6257.  
  6258.         /* frame is done */
  6259.         CGrafPtr savePort;
  6260.         GDHandle saveGD;
  6261.         PixMapHandle bufferPM, savePM;
  6262.         Rect bufferRect;
  6263.         CGrafPtr tempPort = (CGrafPtr)refCon;
  6264.  
  6265.         /* set to our temporary port */
  6266.         GetGWorld (&savePort, &saveGD);
  6267.         SetGWorld (tempPort, nil);
  6268.  
  6269.         /* find out about this buffer */
  6270.         err = SGGetBufferInfo (c, bufferNum, &bufferPM, &bufferRect,
  6271.                                         nil, nil);
  6272.         if (!err) {
  6273.  
  6274.             /* set up to draw into this buffer */
  6275.             savePM = tempPort->portPixMap;
  6276.             SetPortPix(bufferPM);
  6277.  
  6278.             /* draw some text into the buffer */
  6279.             TextMode (srcXor);
  6280.             MoveTo (bufferRect.right - 20, bufferRect.bottom - 14);
  6281.             DrawString ("\pQT");
  6282.             TextMode(srcOr);
  6283.             /* restore temporary port */
  6284.             SetPortPix (savePM);
  6285.         }
  6286.         SetGWorld (savePort, saveGD);
  6287.     }
  6288.     return err;
  6289. }
  6290. OSErr setupVideoBottlenecks (SGChannel videoChannel, WindowPtr w,
  6291.                                      CGrafPtr tempPort)
  6292. {
  6293.     OSErr err;
  6294.     err = SGSetChannelRefCon (videoChannel, (long)tempPort);
  6295.     if (!err) {
  6296.         VideoBottles vb;
  6297.  
  6298.         /* get the current bottlenecks */
  6299.         vb.procCount = 9;
  6300.         err = SGGetVideoBottlenecks (videoChannel, &vb);
  6301.         if (!err) {
  6302.             /* add our GrabFrameComplete function */
  6303.             vb.grabCompleteProc = myGrabFrameComplete;
  6304.             err = SGSetVideoBottlenecks (videoChannel, &vb);
  6305.  
  6306.             /* set up the temporary port */
  6307.             OpenCPort (tempPort);                                /* create a temporary port 
  6308.                                                 for drawing */
  6309.             SetRectRgn (tempPort->visRgn, -32000, -32000, 32000,
  6310.                              32000);                /* with a wide open visible 
  6311.                                                 and clip region . . . */
  6312.             CopyRgn (tempPort->visRgn, tempPort->clipRgn);    
  6313.                                              /* so that you can use it in
  6314.                                                 any video buffer */
  6315.             PortChanged ((GrafPtr)tempPort);    
  6316.                                             /* tell QuickDraw about the
  6317.                                                 changes */
  6318.         }
  6319.     }
  6320.  
  6321.     return err;
  6322. }
  6323.  
  6324.  
  6325. Sequence Grabber Components Reference
  6326.  
  6327. This section describes the data structures and functions that are specific to sequence grabber components.
  6328. Data Types
  6329.  
  6330. This section describes the compression information structure and the sequence grabber frame information structure.
  6331. Note
  6332. You only need to know about the frame information structure if you are creating a sequence grabber component. If you are not creating a sequence grabber component, you may skip this section.u
  6333. The Compression Information Structure
  6334.  
  6335. The compression information structure defines the characteristics of a buffer that contains a captured image that has been compressed. Callback functions use compression information structures to exchange information about compressed images. For example, the compress-complete function must format a compression information record whenever a video frame is compressed (see “Video Channel Callback Functions” beginning on page 5-99 for more information about the compress-complete callback function). The SGCompressInfo data type defines a compression information structure.
  6336. struct SGCompressInfo {
  6337.     Ptr                    buffer;                /* buffer for compressed image */
  6338.     unsigned long                    bufferSize;                /* bytes of image data in buffer */
  6339.     unsigned char                    similarity;                /* relative similarity */
  6340.     unsigned char                    reserved;                /* reserved--set to 0 */
  6341. };
  6342. typedef struct SGCompressInfo SGCompressInfo;
  6343. Field descriptions
  6344. buffer    Points to the buffer that contains the compressed image. 
  6345. This pointer must contain a 32-bit clean address.
  6346. bufferSize    Specifies the number of bytes of image data in the buffer.
  6347. similarity    Indicates the relative similarity of this image to the previous image in a sequence. A value of 0 indicates that the current frame is a 
  6348. key frame in the sequence. A value of 255 indicates that the current frame is identical to the previous frame. Values from 1 through 254 indicate relative similarity, ranging from very different (1) to very similar (254).
  6349. reserved    Reserved for use by Apple. Set this field to 0.
  6350. The Frame Information Structure
  6351.  
  6352. The frame information structure defines a frame for a sequence grabber component and sequence grabber channel components. The SeqGrabFrameInfo data type defines the format of a frame information structure.
  6353. struct SeqGrabFrameInfo {
  6354.     long                 frameOffset;                    /* offset to the sample */
  6355.     long                 frameTime;                    /* time that frame was captured */
  6356.     long                 frameSize;                    /* number of bytes in sample */
  6357.     SGChannel                 frameChannel;                    /* current connection to channel */
  6358.     long                 frameRefCon;                    /* reference constant for channel */
  6359. };
  6360. Field descriptions
  6361. frameOffset    Specifies the offset to the sample.
  6362. frameTime    Specifies the time at which a sequence grabber channel component captured the frame. This time value is relative to the data sequence. That is, this time is not represented in the context of any fixed time scale. Rather, the channel component must choose and use a 
  6363. time scale consistently for all sample references.
  6364. frameSize    Specifies the number of bytes in the sample described by the sample reference.
  6365. frameChannel    Identifies the current connection to the channel component. 
  6366. frameRefCon    Contains a reference constant for use by the channel component. A channel component can use this value in any way that is appropriate. For example, video channel components may use this value to store a reference to frame differencing information for a temporally compressed image sequence.
  6367. Sequence Grabber Component Functions
  6368.  
  6369. This section describes the functions that are provided by sequence grabber components. These functions are described from the perspective of an application developer. If you are developing a sequence grabber component, your component must behave as described here.
  6370. This section discusses the following groups of functions:
  6371. n    “Configuring Sequence Grabber Components” describes the functions that allow you to configure a sequence grabber component, including creating channels for the component.
  6372. n    “Controlling Sequence Grabber Components” discusses the functions that allow you to control a record or preview operation.
  6373. n    “Working With Sequence Grabber Settings” discusses the functions that allow you to obtain sequence grabber configuration data from the user.
  6374. n    “Working With Sequence Grabber Characteristics” describes functions that allow you to manage some of the detailed characteristics of a sequence grabber component.
  6375. n    “Working With Channel Characteristics” describes functions that allow you to configure the general characteristics of a sequence grabber channel.
  6376. n    “Working With Channel Devices” discusses functions that allow you to determine the device that is attached to a sequence grabber channel.
  6377. n    “Working With Video Channels” describes functions that allow you to configure video channels.
  6378. n    “Working With Sound Channels” discusses functions that allow you to configure sound channels.
  6379. n    “Video Channel Callback Functions” describes the callback functions that are supported by video channels.
  6380. n    “Utility Functions for Video Channel Callback Functions” discusses a number of utility functions that sequence grabber components provide for use by callback functions.
  6381. Configuring Sequence Grabber Components
  6382.  
  6383. Sequence grabber components provide a number of functions that allow you to establish the environment for grabbing or previewing digitized data. Before you can start a record or a preview operation, you must initialize the sequence grabber component, establish the channels that will be used, define the display environment for the operation, and determine the optimum screen position for the sequence grabber. In addition, if you are performing a record operation, you must define a destination movie file. This section describes the sequence grabber component functions that allow you to perform these tasks.
  6384. You can use the SGInitialize function to initialize a sequence grabber component. Before you can call this function, you must establish a connection to the sequence grabber by calling the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6385. The SGNewChannel function allows you to create channels for the sequence grabber for an operation. You can use the SGNewChannelFromComponent function to create a new channel using a specified channel component. Use the SGDisposeChannel function to dispose of those channels that you are no longer using.
  6386. You can use the SGGetIndChannel function to retrieve information about the channels that are currently in use by the sequence grabber.
  6387. You can use the SGSetGWorld and SGGetGWorld functions to establish the display environment for the sequence grabber. These functions affect only those channels that work with data that has visual information.
  6388. The SGSetDataOutput and SGGetDataOutput functions allow you to identify the movie file that is currently assigned to the sequence grabber. You only use these functions when you are performing a record operation.
  6389. The SGSetDataProc function allows you to assign a data function to a channel. The sequence grabber calls your data function whenever it writes movie data to the 
  6390. output file. 
  6391. The SGGetAlignmentProc function allows you to determine a sequence grabber’s optimum screen position to ensure the best performance and appearance. 
  6392. SGInitialize
  6393.  
  6394. The SGInitialize function allows you to initialize the sequence grabber component. Before you can call this function you must establish a connection to the sequence grabber component. Use the Component Manager’s OpenDefaultComponent or OpenComponent function to establish a component connection.
  6395. pascal ComponentResult SGInitialize (SeqGrabComponent s);
  6396. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6397. DESCRIPTION
  6398. You must call the SGInitialize function before you call any other sequence grabber component functions. If this function returns a nonzero result code, you should close your connection to the sequence grabber component.
  6399. RESULT CODES
  6400. Memory Manager errors
  6401. SGSetDataOutput
  6402.  
  6403. The SGSetDataOutput function allows you to specify the movie file for a record operation and to specify other options that govern the operation. The sequence grabber component stores the data that is obtained during the record operation as a QuickTime movie in this file. This function also allows you to control some aspects of the record operation, which are related to output, by specifying control flags. These flags are discussed in the function description that follows.
  6404. pascal ComponentResult SGSetDataOutput (SeqGrabComponent s, 
  6405.                                                      FSSpec *movieFile, 
  6406.                                                      long whereFlags);
  6407. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6408. movieFile    Contains a pointer to the movie file for this record operation. 
  6409. whereFlags
  6410. Contains flags that control the record operation. The following flags are defined by the SeqGrabDataOutputEnum data type; you must set either the seqGrabToDisk flag or the seqGrabToMemory flag to 1 (set unused flags to 0).
  6411. seqGrabToDisk
  6412. Instructs the sequence grabber component to write the recorded data to a QuickTime movie in the movie file specified by the movieFile parameter. If you set this flag to 1, the sequence grabber writes the data to the file as the data is recorded. Set this flag to 0 if you set the seqGrabToMemory flag to 1 (only one of these two flags may be set to 1).
  6413. seqGrabToMemory
  6414. Instructs the sequence grabber component to store the recorded data in memory until the recording process is complete. The sequence grabber then writes the recorded data to the movie file specified by the movieFile parameter. This technique provides better performance than recording directly to the movie file, but it limits the amount of data you can record. Set this flag to 1 to record to memory. Set this flag to 0 if you set the seqGrabToDisk flag to 1 (only one of these two flags may be set to 1).
  6415. seqGrabDontUseTempMemory
  6416. Prevents the sequence grabber component from using temporary memory during the record operation. By default, the sequence grabber component and its channel components use as much temporary memory as necessary to perform the record operation. Set this flag to 1 to prevent the sequence grabber component and its channel components from using temporary memory.
  6417. seqGrabAppendToFile
  6418. Directs the sequence grabber component to add the recorded data to the data fork of the movie file specified by the movieFile parameter. By default, the sequence grabber component deletes the movie file and creates a new file containing one movie and the corresponding movie resource. Set this flag to 1 to cause the sequence grabber component to append the recorded data to the data fork of the movie file and create a new movie resource in that file.
  6419. seqGrabDontAddMovieResource
  6420. Prevents the sequence grabber component from adding the new movie resource to the movie file specified by the movieFile parameter. By default, the sequence grabber component creates a new movie resource and adds that resource to the movie file. Set this flag to 1 to prevent the sequence grabber component from adding the movie resource to the movie file. You are then responsible for adding the resource to a file, if you so desire.
  6421. seqGrabDontMakeMovie
  6422. Prevents the sequence grabber component from creating a movie. By default, the sequence grabber component creates a new movie resource and adds the captured data to that movie. If you set this flag to 1, the sequence grabber still calls your data function, but does not write any data to the movie file. 
  6423. DESCRIPTION
  6424. If you are performing a preview operation, you do not need to use the SGSetDataOutput function.
  6425. RESULT CODESnotEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  6426. notEnoughDiskSpaceToGrab    –9404    Insufficient disk space for record operation    
  6427.  
  6428. File Manager errors
  6429. Memory Manager errors
  6430. SGGetDataOutput
  6431.  
  6432. The SGGetDataOutput function allows you to determine the movie file that is currently assigned to a sequence grabber component and the control flags that would govern a record operation. 
  6433. pascal ComponentResult SGGetDataOutput (SeqGrabComponent s, 
  6434.                                                      FSSpec *movieFile, 
  6435.                                                      long *whereFlags);
  6436. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6437. movieFile    Contains a pointer to a file system specification record that is to receive information about the movie file for this record operation. 
  6438. whereFlags
  6439. Contains a pointer to a long integer that is to receive flags that control 
  6440. the record operation. The following flags are defined (unused flags are 
  6441. set to 0):
  6442. seqGrabToDisk
  6443. Instructs the sequence grabber component to write the recorded data to a QuickTime movie in the movie file specified by the movieFile parameter. If this flag is set 
  6444. to 1, the sequence grabber writes the data to the file as the data is recorded. 
  6445. seqGrabToMemory
  6446. Instructs the sequence grabber component to store the recorded data in memory until the recording process is complete. The sequence grabber then writes the recorded data to the movie file specified by the movieFile parameter. This technique provides better performance than recording directly to the movie file, but it limits the amount of data you can record. If this flag is set to 1, the sequence grabber component is recording to memory.
  6447. seqGrabDontUseTempMemory
  6448. Prevents the sequence grabber component from using temporary memory during the record operation. By default, the sequence grabber component and its channel components use as much temporary memory as necessary to perform the record operation. If this flag is set to 1, the sequence grabber component and its channel components do not use temporary memory.
  6449. seqGrabAppendToFile
  6450. Directs the sequence grabber component to add the recorded data to the data fork of the movie file specified by the movieFile parameter. By default, the sequence grabber component deletes the movie file and creates a new file containing one movie and its movie resource. If this flag is set to 1, the sequence grabber component appends the recorded data to the data fork of the movie file and creates a new movie resource in that file.
  6451. seqGrabDontAddMovieResource
  6452. Prevents the sequence grabber component from adding the new movie resource to the movie file specified by the movieFile parameter. By default, the sequence grabber component creates a new movie resource and adds that resource to the movie file. If this flag is set to 1, the sequence grabber component does not add the movie resource to the movie file. You are then responsible for adding the resource to a file, if you so desire.
  6453. seqGrabDontMakeMovie
  6454. Prevents the sequence grabber component from creating a movie. By default, the sequence grabber component creates a new movie resource and adds the captured data to that movie. If this flag is set to 1, the sequence grabber still calls your data function, but does not write any data to the movie file. 
  6455. DESCRIPTION
  6456. You set these characteristics by calling the SGSetDataOutput function, which is described in the previous section. If you have not set these characteristics before calling the SGGetDataOutput function, the returned data is meaningless.
  6457. SGSetGWorld
  6458.  
  6459. The SGSetGWorld function allows you to establish the graphics port and device for a sequence grabber component. The sequence grabber component displays the recorded or previewed data in this graphics world. 
  6460. pascal ComponentResult SGSetGWorld (SeqGrabComponent s, 
  6461.                                                 CGrafPtr gp, GDHandle gd);
  6462. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6463. gp    Specifies the destination graphics port. The specified graphics port must be a color graphics port. Set this parameter to nil to use the current graphics port.
  6464. gd    Specifies the destination graphics device. Set this parameter to nil to use the current device. If the gp parameter specifies a graphics world, set this parameter to nil to use that graphics world’s graphics device.
  6465. DESCRIPTION
  6466. You must call this function if you are working with any channels that collect visual data. If you are working only with data that has no visual representation, you do not need to call this function. The sequence grabber component performs this operation implicitly when you call the SGInitialize function (described on page 5-25), and the component uses your application’s current graphics port. 
  6467. You cannot call this function during a record or preview operation or after you have prepared the sequence grabber component for a record or preview operation (by calling the SGPrepare function, which is described on page 5-43).
  6468. IMPORTANT
  6469. The window in which the sequence grabber is to draw video frames as defined by SGSetGWorld must be visible before you call the SGPrepare function. Otherwise, the sequence grabber does not display the frames properly. For details, see the discussion of SGPrepare beginning on page 5-43.s
  6470. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  6471.  
  6472. SGGetGWorld
  6473.  
  6474. The SGGetGWorld function allows you to determine the graphics port and device for a sequence grabber component. 
  6475. pascal ComponentResult SGGetGWorld (SeqGrabComponent s, 
  6476.                                                  CGrafPtr *gp, GDHandle *gd);
  6477. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6478. gp    Contains a pointer to a location that is to receive a pointer to the destination graphics port. Set this parameter to nil if you are not interested in this information.
  6479. gd    Contains a pointer to a location that is to receive a handle to the destination graphics device. Set this parameter to nil if you are not interested in this information.
  6480. DESCRIPTION
  6481. The sequence grabber component displays the recorded or previewed data in this graphics world.
  6482. SEE ALSO
  6483. You can establish the graphics port and device for a sequence grabber component by calling the SGSetGWorld function, which is described in the previous section.
  6484. SGNewChannel
  6485.  
  6486. The SGNewChannel function creates a sequence grabber channel and assigns a channel component to the channel. The channel component is responsible for providing digitized data to the sequence grabber component. You specify the type of channel component to be added to the sequence grabber component. 
  6487. pascal ComponentResult SGNewChannel (SeqGrabComponent s, 
  6488.                                                  OSType channelType,
  6489.                                                  SGChannel *ref);
  6490. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6491. channelType
  6492. Specifies the type of channel to open. This value corresponds to the component subtype value of the channel component. The following values are valid:
  6493. VideoMediaType
  6494. Video channel
  6495. SoundMediaType
  6496. Sound channel
  6497. ref    Contains a pointer to the frameChannel field in the sequence grabber information structure that is to receive a reference to the channel that is added to the sequence grabber component. If the sequence grabber component successfully locates and connects to an appropriate 
  6498. channel component, the sequence grabber component returns a reference to the channel component into the field referred to by this parameter. If the sequence grabber component cannot open a connection, it sets the result code to a nonzero value.
  6499. DESCRIPTION
  6500. The sequence grabber component locates, and attempts to connect to, an appropriate channel component. If the sequence grabber component cannot locate or connect to 
  6501. a channel component, it returns a nonzero result code.
  6502. RESULT CODEScouldntGetRequiredComponent    –9405    Component not found    
  6503.  
  6504. Memory Manager errors
  6505. SEE ALSO
  6506. When you are done with the sequence grabber component, you can dispose of the channels you have used by calling the SGDisposeChannel function, which is described on page 5-34. However, when you close the sequence grabber component, it automatically disposes of all its channels, so this function is usually unnecessary.
  6507. If you want to use a specific channel component, you may use the SGNewChannelFromComponent function, which is described next.
  6508. SGNewChannelFromComponent
  6509.  
  6510. The SGNewChannelFromComponent function creates a sequence grabber channel and assigns a channel component to the channel. The channel component is responsible for providing digitized data to the sequence grabber component. You specify the channel component to be used. 
  6511. pascal ComponentResult SGNewChannelFromComponent 
  6512.                              (SeqGrabComponent s, SGChannel *newChannel, 
  6513.                              Component sgChannelComponent);
  6514. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6515. newChannel
  6516. Contains a pointer to a channel component that is to receive a reference to the channel that is added to the sequence grabber component. If the sequence grabber component successfully locates and connects to the specified channel component, the sequence grabber component returns a reference to the channel component into the field referred to by this parameter. If the sequence grabber component cannot open a connection, it sets the result code to a nonzero value.
  6517. sgChannelComponent
  6518. Identifies the channel component to use. You supply a component ID value to the sequence grabber. The sequence grabber then opens a connection to that channel component and returns your connection ID in the field specified by the newChannel parameter. You may obtain a component ID value by calling the Component Manager’s FindNextComponent function.
  6519. DESCRIPTION
  6520. The sequence grabber component locates and connects to the specified channel component. If the sequence grabber component cannot locate or connect to the channel component, it returns a nonzero result code.
  6521. This function is similar to the SGNewChannel function, except that this function allows you to specify a particular component rather than just a component subtype value. Use this function if you want to connect to a specific component.
  6522. RESULT CODEScouldntGetRequiredComponent    –9405    Component not found    
  6523.  
  6524. Memory Manager errors
  6525. SEE ALSO
  6526. You may also use the SGNewChannel function to establish a new channel. That function requires only a component subtype value, and is described on page 5-31.
  6527. When you are done with the sequence grabber component, you can dispose of the channels you have used by calling the SGDisposeChannel function, which is described on page 5-34.
  6528. SGGetIndChannel
  6529.  
  6530. The SGGetIndChannel function allows you to collect information about all of the channel components currently in use by a sequence grabber component. 
  6531. pascal ComponentResult SGGetIndChannel (SeqGrabComponent s, 
  6532.                                                      short index, 
  6533.                                                      SGChannel *ref,
  6534.                                                       OSType *chanType);
  6535. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6536. index    Specifies an index value. This value identifies the channel to be queried. The first channel has an index value of 1.
  6537. ref    Contains a pointer to a field to receive a value identifying your connection to the channel. If you do not want to receive this information, set this parameter to nil.
  6538. chanType    Contains a pointer to a field to receive the channel’s subtype value. This value indicates the media type supported by the channel component. The following values are valid:
  6539. VideoMediaType
  6540. Video channel
  6541. SoundMediaType
  6542. Sound channel
  6543.     If you do not want to receive this information, set this parameter to nil.
  6544. DESCRIPTION
  6545. You may use the SGGetIndChannel function to retrieve information about each of the channel components currently in use by a sequence grabber component. You identify 
  6546. the channel in which you are interested by specifying an index value. These index values start at 1 and increase sequentially; each channel has its own index value.
  6547. RESULT CODEparamErr    –50    Component not found    
  6548.  
  6549. SGDisposeChannel
  6550.  
  6551. The SGDisposeChannel function removes a channel from a sequence grabber component. 
  6552. pascal ComponentResult SGDisposeChannel 
  6553.                                         (SeqGrabComponent s, SGChannel c);
  6554. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6555. c    Specifies the reference that identifies the channel you want to close. You obtain this reference from the SGNewChannel function, described in the previous section.
  6556. DESCRIPTION
  6557. You can use this function to remove a channel that you are no longer using. However, you cannot dispose of a channel that is currently active—if you are recording or previewing data, this function returns a nonzero result code.
  6558. RESULT CODEbadSGChannel    –9406    Invalid channel specified    
  6559.  
  6560. SEE ALSO
  6561. The sequence grabber component automatically disposes of any open channels when you close your connection to the component, so you do not need to call this function prior to calling the Component Manager’s CloseComponent function.
  6562. SGSetDataProc
  6563.  
  6564. The SGSetDataProc function allows you to specify a data function for use by the sequence grabber. Whenever any channel assigned to the sequence grabber writes data, your data function is called as well. Your data function may then write the data to another destination.
  6565. pascal ComponentResult SGSetDataProc (SeqGrabComponent sg,         
  6566.                                                     SGDataProc proc, 
  6567.                                                     long refCon);
  6568. sg    Identifies your connection to the sequence grabber component. 
  6569. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6570. proc    Contains a pointer to your data function. To remove your data function, set this parameter to nil. The interface that your data function must support is described in “Application-Defined Functions” beginning on page 5-111.
  6571. refCon    Contains a reference constant. The sequence grabber provides this value to your data function.
  6572. DESCRIPTION
  6573. Your application may use the SGSetDataProc function to assign a data function to a sequence grabber. The sequence grabber calls your data function whenever any channel component writes data to the destination movie. You may use your data function to store the digitized data in some format other than a QuickTime movie. 
  6574. SEE ALSO
  6575. You can instruct the sequence grabber not to write its data to a QuickTime movie by calling the SGSetDataOutput function and setting the seqGrabDontMakeMovie flag to 1. This can save processing time in cases where you do not want to create a movie. This function is discussed beginning on page 5-26.
  6576. SGGetAlignmentProc
  6577.  
  6578. The SGGetAlignmentProc function allows you to obtain information about the best screen positions for a sequence grabber’s video image in terms of appearance and maximum performance.
  6579. pascal ComponentResult SGGetAlignmentProc (SeqGrabComponent s,         
  6580.                                     AlignmentProcRecordPtr alignmentProc);
  6581. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6582. alignmentProc    
  6583. Contains a pointer to an Image Compression Manager alignment function structure. The sequence grabber places its alignment information into 
  6584. this structure.
  6585. DESCRIPTION
  6586. You may use the SGGetAlignmentProc function to retrieve information about the best screen positions for the sequence grabber’s window. The sequence grabber returns information that can be used by the Image Compression Manager’s alignment functions (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information about these functions). By using this alignment information, you can place the sequence grabber’s window in a position that allows for optimal display performance.
  6587. Controlling Sequence Grabber Components
  6588.  
  6589. Sequence grabber components provide a full set of functions that allow your application to control the preview or record operation. You can use these functions to start and stop the operation, to pause data collection, and to retrieve a reference to the movie that is created during a record operation. This section describes these functions.
  6590. Use the SGStartPreview function to start a preview operation. The SGStartRecord function lets you start a record operation. The SGStop function allows you to stop a sequence grabber component. 
  6591. You can instruct the sequence grabber to pause by calling the SGPause function. You can determine whether the sequence grabber is paused by calling the SGGetPause function.
  6592. You grant processing time to the sequence grabber by calling the SGIdle function. Be sure to call this function often during record and preview operations. If your application receives an update event during a record or preview operation, you should call the SGUpdate function.
  6593. You can prepare the sequence grabber for an upcoming preview or record operation by calling the SGPrepare function. This function also allows the sequence grabber to verify that it can support the parameters you have specified. By verifying the parameters you want to use, you can improve the startup of preview and record operations. Use the SGRelease function to release system resources after calling the SGPrepare function.
  6594. You can retrieve a reference to the movie created by a record operation by calling the SGGetMovie function. You can determine the resource ID value assigned to the last movie resource created by the sequence grabber by calling the SGGetLastMovieResID function.
  6595. You can extract a picture from the video source data by calling the SGGrabPict function.
  6596. SGStartPreview
  6597.  
  6598. The SGStartPreview function instructs the sequence grabber to begin processing data from its channels. 
  6599. pascal ComponentResult SGStartPreview (SeqGrabComponent s);
  6600. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6601. DESCRIPTION    
  6602. The sequence grabber immediately presents the data to the user in the appropriate format, according to the channel configuration parameters you have specified (see “Working With Channel Characteristics” beginning on page 5-58 for information about configuring channels). Video data is displayed in the destination display region; sound data is played at the specified volume settings.
  6603. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  6604. deviceCantMeetRequest    –9408    Device cannot support grabber    
  6605.  
  6606. File Manager errors
  6607. Memory Manager errors
  6608. SEE ALSO
  6609. You stop the preview process by calling the SGStop function, which is described on page 5-40.
  6610. In preview mode, the sequence grabber does not save any of the data it gathers from its channels. If you want to record the data, use record mode. You start a record operation by calling the SGStartRecord function, which is described in the next section.
  6611. SGStartRecord
  6612.  
  6613. The SGStartRecord function instructs the sequence grabber component to begin collecting data from its channels. 
  6614. pascal ComponentResult SGStartRecord (SeqGrabComponent s);
  6615. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6616. DESCRIPTION
  6617. The sequence grabber stores the collected data according to the recording parameters you specify with the SGSetDataOutput function, which is described on page 5-26. Before calling this function, you must correctly configure the sequence grabber’s channels—see “Working With Channel Characteristics” beginning on page 5-58 for information about configuring sequence grabber channels.
  6618. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  6619. notEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  6620. notEnoughDiskSpaceToGrab    –9404    Insufficient disk space for record operation    
  6621. deviceCantMeetRequest    –9408    Device cannot support grabber    
  6622.  
  6623. File Manager errors
  6624. Memory Manager errors
  6625. SEE ALSO
  6626. You can switch from previewing to recording by calling this function during a preview operation—you need not stop the preview operation first. You stop the recording process by calling the SGStop function, which is described on page 5-40.
  6627. You can cause the sequence grabber to display the data it obtains from its channels without storing any of the data by calling the SGStartPreview function, which is described in the previous section. 
  6628. SGIdle
  6629.  
  6630. The SGIdle function provides processing time to the sequence grabber component and its channel components. After starting a preview or record operation, you should call this function as often as possible, until you stop the operation by calling SGStop. 
  6631. sWARNING
  6632. If you do not call SGIdle frequently enough, you may lose data.s
  6633. pascal ComponentResult SGIdle (SeqGrabComponent s);
  6634. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6635. DESCRIPTION
  6636. The SGIdle function reports several status and error conditions by means of its result code. If you have established a time limit for a record operation by calling the SGSetMaximumRecordTime function (described on page 5-53), SGIdle returns a result code of grabTimeComplete when the time limit expires. In addition, SGIdle reports errors that are specific to the channels that are active for a given operation. If SGIdle returns a nonzero result code during a record operation, you should still call the SGStop function (described on page 5-40) so that the sequence grabber can store the data it has collected.
  6637. RESULT CODESgrabTimeComplete    –9401    Time for record operation has expired    
  6638. cantDoThatInCurrentMode    –9402    Request invalid in current mode    
  6639.  
  6640. File Manager errors
  6641. Memory Manager errors
  6642. SGUpdate
  6643.  
  6644. The SGUpdate function allows you to tell the sequence grabber that it must refresh its display. 
  6645. pascal ComponentResult SGUpdate (SeqGrabComponent s,
  6646.                                               RgnHandle updateRgn);
  6647. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6648. updateRgn    Indicates the part of the window that has been changed. You may use this parameter to specify a portion of the window that you know has been changed. You can obtain this information by examining the appropriate window record. For example:
  6649.     SGUpdate (theSG, ((WindowPeek)updateWindow)->updateRgn);
  6650.     If you set this parameter to nil, the sequence grabber uses the window’s current visible region.
  6651. DESCRIPTION
  6652. You may use the SGUpdate function to tell the sequence grabber that it must refresh its display. You should call this function whenever you receive an update event for a window that contains a sequence grabber display. You should call this function before calling the Window Manager’s BeginUpdate function.
  6653. Your application should avoid drawing where the sequence grabber is displaying video. Doing so may cause some video digitizer components to stop displaying video.
  6654. SPECIAL CONSIDERATIONS
  6655. It is dangerous to allow an update event to occur during recording. Many digitizers capture directly to the screen; thus, an update event will result in data loss.
  6656. RESULT CODESparamErr    –50    Component not found    
  6657. deviceCantMeetRequest    –9408    Device cannot support grabber    
  6658.  
  6659. SGStop
  6660.  
  6661. The SGStop function stops a preview or record operation. 
  6662. pascal ComponentResult SGStop (SeqGrabComponent s);
  6663. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6664. DESCRIPTION
  6665. The sequence grabber releases any system resources it used during the operation, such as temporary memory. In the case of a record operation, the sequence grabber stores the collected movie data in the assigned movie file—you specify the movie file by calling the SGSetDataOutput function, which is described on page 5-26.
  6666. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  6667.  
  6668. File Manager errors
  6669. Memory Manager errors
  6670. SGPause
  6671.  
  6672. You can suspend or restart a record or preview operation by calling the SGPause function. You supply a byte value that instructs the sequence grabber whether to pause or restart the current operation. 
  6673. pascal ComponentResult SGPause (SeqGrabComponent s, 
  6674.                                          Byte pause);
  6675. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6676. pause    Instructs the sequence grabber whether to suspend or restart the current operation. The following values are valid:
  6677. seqGrabUnpause
  6678. Restarts the current operation.
  6679. seqGrabPause    
  6680. Pauses the current operation.
  6681. seqGrabPauseForMenu    
  6682. Pauses the current operation so that you may display a menu. Use this option only in preview mode, just before you call the Menu Manager’s MenuSelect or PopUpMenuSelect function. In this case, the sequence grabber may not pause all channels, depending upon the ability of the sequence grabber to play with acceptable quality. For example, sound channels may continue to play while video channels are paused.
  6683. DESCRIPTION
  6684. The SGPause function does not release any system resources or temporary memory associated with the current operation. Consequently, it is generally much faster than using the SGStop and SGStartRecord functions or the SGStartPreview function to suspend an operation.
  6685. SPECIAL CONSIDERATIONS
  6686. When you restart the operation, the sequence grabber component may be unable to satisfy your request. This can occur, for example, if the user has moved the display window to a location that the digitizing hardware cannot support.
  6687. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  6688. notEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  6689. deviceCantMeetRequest    –9408    Device cannot support grabber    
  6690.  
  6691. File Manager errors
  6692. Memory Manager errors
  6693. SEE ALSO
  6694. You may determine whether the sequence grabber is paused by calling the SGGetPause function, which is described next.
  6695. SGGetPause
  6696.  
  6697. You can determine whether the sequence grabber is paused by calling the SGGetPause function. 
  6698. pascal ComponentResult SGGetPause (SeqGrabComponent s, 
  6699.                                                  Byte *paused);
  6700. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6701. paused    Contains a pointer to a field that is to receive a value that indicates whether the sequence grabber is currently paused. The following values are valid:
  6702. seqGrabUnpause
  6703. The sequence grabber is not paused.
  6704. seqGrabPause                                                                
  6705. The sequence grabber is paused—all channels are stopped.
  6706. seqGrabPauseForMenu
  6707. The sequence grabber is paused in order to display a menu—some or all of the channels may be stopped.
  6708. DESCRIPTION
  6709. The SGGetPause function allows you to determine whether the sequence grabber is paused.
  6710. SEE ALSO
  6711. You may pause or restart the sequence grabber by calling the SGPause function, which is described in the previous section.
  6712. SGPrepare
  6713.  
  6714. The SGPrepare function instructs the sequence grabber to get ready to begin a preview or record operation (or to commence both operations). You specify the operations. 
  6715. pascal ComponentResult SGPrepare (SeqGrabComponent s, 
  6716.                                             Boolean prepareForPreview,
  6717.                                             Boolean prepareForRecord);
  6718. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6719. prepareForPreview
  6720. Instructs the sequence grabber component to prepare for a preview operation. Set this parameter to true to prepare for a preview operation. You may set both the prepareForPreview and prepareForRecord parameters to true.
  6721. prepareForRecord
  6722. Instructs the sequence grabber component to prepare for a record operation. Set this parameter to true to prepare for a record operation. You may set both the prepareForPreview and prepareForRecord parameters to true.
  6723. DESCRIPTION
  6724. The sequence grabber component does whatever is necessary to get ready to start the preview or record operation. This may involve allocating memory, readying hardware, and notifying the sequence grabber’s channels. By calling this function, you ensure that the SGStartRecord or SGStartPreview function starts as quickly as possible.
  6725. If you do not call this function before starting a record or preview operation, the sequence grabber component makes these preparations when you start the operation. You cannot call this function after you start a preview or record operation.
  6726. If you call SGPrepare without subsequently starting a record or preview operation, you should call the SGRelease function (described in the next section). This allows the sequence grabber component to release any system resources it allocated when you called SGPrepare.
  6727. SPECIAL CONSIDERATIONS
  6728. The window in which the sequence grabber is to draw video frames (as defined by 
  6729. the SGSetGWorld function, described on page 5-29) must be visible before you call the SGPrepare function. Otherwise, the sequence grabber does not display the frames properly. If the window isn’t visible and SGPrepare is called with the prepareForPreview parameter set to true and the prepareForRecord parameter set to false, and the window is subsequently shown via the Window Manager’s ShowWindow routine, the sequence grabber won’t display frames properly in the video window. The visible region of the window wasn’t valid when the SGPrepare call 
  6730. was made. 
  6731. RESULT CODESparamErr    –50    Invalid parameter specified    
  6732. cantDoThatInCurrentMode    –9402    Request invalid in current mode    
  6733. notEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  6734. notEnoughDiskSpaceToGrab    –9404    Insufficient disk space for record operation    
  6735. deviceCantMeetRequest    –9408    Device cannot support grabber    
  6736.  
  6737. File Manager errors
  6738. Memory Manager errors
  6739. SGRelease
  6740.  
  6741. The SGRelease function instructs the sequence grabber to release any system resources it allocated when you called the SGPrepare function, which is described in the previous section. You should call SGRelease whenever you call SGPrepare without subsequently starting a record or preview operation. 
  6742. pascal ComponentResult SGRelease (SeqGrabComponent s);
  6743. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6744. DESCRIPTION
  6745. When you stop a record or preview operation by calling the SGStop function, the sequence grabber component automatically releases the resources it uses during the operation. Consequently, you do not have to call this function after a record or 
  6746. preview operation. 
  6747. You cannot call the SGRelease function during a record or preview operation.
  6748. SGGetMovie
  6749.  
  6750. The SGGetMovie function returns a reference to the movie that contains the data collected during a record operation. You can use this movie identifier with Movie Toolbox functions. However, you should not dispose of this movie—it is owned by the sequence grabber component. Furthermore, the sequence grabber component disposes of this movie when you prepare for or start the next record or preview operation, or when you close the connection to the sequence grabber. If you want to work with a movie containing the collected data, use the Movie Toolbox’s NewMovieFromFile function (see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for more information).
  6751. You can call this function only after you have stopped the record operation by calling the SGStop function.
  6752. pascal Movie SGGetMovie (SeqGrabComponent s);
  6753. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6754. DESCRIPTION
  6755. The SGGetMovie function returns a reference to the movie that contains the data collected during a record operation. If there is no current movie, either because you are in preview mode or because you have not yet stopped the record operation, the sequence grabber component sets this returned reference to nil.
  6756. RESULT CODEseqGrabInfoNotAvailable    –9407    Sequence grabber cannot support request    
  6757.  
  6758. SGGetLastMovieResID
  6759.  
  6760. The SGGetLastMovieResID allows you to retrieve the last resource ID used by the sequence grabber component. The sequence grabber component assigns a new resource ID to each movie resource it creates. The sequence grabber creates the movie resource when you stop a record operation by calling the SGStop function, unless you have instructed the sequence grabber not to add the movie resource to the movie file (see the description of the SGSetDataOutput function beginning on page 5-26 for more information). 
  6761. pascal ComponentResult SGGetLastMovieResID (SeqGrabComponent s,
  6762.                                                              short *resID) ;
  6763. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6764. resID    Contains a pointer to an integer that is to receive the resource ID the sequence grabber assigned to the movie resource it just created. 
  6765. DESCRIPTION
  6766. If you want this information, you should call this function before you prepare for or start another record or preview operation—because the sequence grabber component resets this value when you start the next operation.
  6767. RESULT CODEseqGrabInfoNotAvailable    –9407    Sequence grabber cannot support request    
  6768.  
  6769. SGGrabPict
  6770.  
  6771. The SGGrabPict function provides a simple interface that allows your application to obtain a QuickDraw picture from a sequence grabber component. The sequence grabber can display the picture directly, or it can write the picture to an offscreen buffer. This function is limited in scope, however, and does not allow you to control all of the parameters that govern the operation. When you call this function, the sequence grabber component obtains and configures appropriate sequence grabber channel components (if necessary), grabs the data, and then releases any components it obtained. 
  6772. pascal ComponentResult SGGrabPict (SeqGrabComponent s, 
  6773.                                                 PicHandle *p, 
  6774.                                                 const Rect *bounds, 
  6775.                                                 short offscreenDepth, 
  6776.                                                 long grabPictFlags);
  6777. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6778. p    Contains a pointer to a field that is to receive a handle to the picture. If the SGGrabPict function cannot create the picture, it sets this handle to nil.
  6779. bounds    Contains a pointer to the boundary region for the picture. By default, 
  6780. this rectangle lies in the current graphics port. If you set the grabPictOffScreen flag in the grabPictFlags parameter to 1, the sequence grabber places the picture in an offscreen graphics world. In this case, the rectangle is interpreted in that offscreen world.
  6781. offscreenDepth
  6782. Specifies the pixel depth for the offscreen graphics world. This parameter is typically set to 0, which chooses the best available depth. If you set the grabPictOffScreen flag in the grabPictFlags parameter to 1, the sequence grabber places the picture in an offscreen graphics world. You specify the pixel depth of this offscreen graphics world with this parameter. If you are displaying the picture, this parameter is ignored.
  6783. grabPictFlags
  6784. Contains flags that control the operation. The following flags are defined (set unused flags to 0):
  6785. grabPictOffScreen
  6786. Instructs the sequence grabber to place the picture in 
  6787. an offscreen graphics world. Set this flag to 1 to 
  6788. use an offscreen graphics world. In this case, you use the offscreenDepth parameter to specify the pixel depth 
  6789. in the offscreen buffer. In addition, the rectangle specified by the bounds parameter is applied to the offscreen buffer.
  6790. grabPictIgnoreClip
  6791. Instructs the sequence grabber to ignore any clipping regions you may have defined for the sequence grabber’s channels. Set this flag to 1 to have the sequence grabber ignore these clipping regions.
  6792. DESCRIPTION
  6793. If you have created any channels for the sequence grabber component, the SGGrabPict function uses those channels to obtain the data for the captured image.
  6794. SPECIAL CONSIDERATIONS
  6795. Some digitizer sources do not support grabbing offscreen, so the SGGrabPict function may fail. In this case, try again grabbing onscreen.
  6796. RESULT CODESnotEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  6797. deviceCantMeetRequest    –9408    Device cannot support grabber    
  6798.  
  6799. File Manager errors
  6800. Memory Manager errors
  6801. Working With Sequence Grabber Settings
  6802.  
  6803. Sequence grabber components can work with channel components and panel components to collect configuration settings from the user. The functions discussed in this section allow you to direct the sequence grabber to display its settings dialog box to the user and to work with the configuration of each of the grabber’s channels. See “About Sequence Grabber Components” on page 5-3 for more information about the relationship between the sequence grabber and panel components.
  6804. Use the SGSettingsDialog function to instruct the sequence grabber to display its settings dialog box to the user.
  6805. The SGSetSettings and SGGetSettings functions allow you to retrieve or set the sequence grabber’s configuration.
  6806. The SGSetChannelSettings and SGGetChannelSettings functions work with the configuration of an individual channel.
  6807. SGSettingsDialog
  6808.  
  6809. You may cause the sequence grabber to display its settings dialog box to the user by calling the SGSettingsDialog function. The user can use this dialog box to specify the configuration of a sequence grabber channel.
  6810. pascal ComponentResult SGSettingsDialog (SeqGrabComponent s, 
  6811.                              SGChannel c, short numPanels, 
  6812.                              Component *panelList, long flags, 
  6813.                              SGModalFilterProcPtr proc, long procRefNum);
  6814. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6815. c    Identifies the channel to be configured. You provide your 
  6816. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function, discussed on page 5-31 and page 5-32, respectively.
  6817. numPanels    Specifies the number of panel components to be listed in the panel component pop-up menu. You specify the panel components with the panelList parameter. You may use these parameters to limit the user’s choice of panel components. If you set this parameter to 0 and 
  6818. the panelList parameter to nil, the sequence grabber lists all available panel components.
  6819. panelList    Contains a pointer to an array of component identifiers. The sequence grabber presents only these components in the panel component pop-up menu. You specify the number of identifiers in the array with the numPanels parameter. If you set this parameter to nil, the sequence grabber lists all available panel components.
  6820. flags    Reserved for Apple Computer. Set this parameter to 0.
  6821. proc    Specifies an event filter function. Because the sequence grabber’s settings dialog box is a movable modal dialog box, you must supply an event filter function to process update events in your window. The interface that your filter function must support is described in “Application-Defined Functions” beginning on page 5-111.
  6822. procRefNum
  6823. Contains a reference constant for use by your filter function.
  6824. IMPORTANT
  6825. IMPORTANT
  6826. Because the settings dialog box is a movable modal dialog box, you must provide an event filter function.s
  6827. DESCRIPTION
  6828. The SGSettingsDialog function instructs the sequence grabber to display its settings dialog box to the user. The sequence grabber works with one or more panel components to configure a specified channel component.
  6829. If the user clicks OK and the settings are acceptable to the panel and channel components, this function returns a result code of noErr. Because the user may change several channel configuration parameters, your application should retrieve new configuration information from the channel so that you can update any values you save, such as the channel’s display boundaries or the channel device. In particular, the video rectangle for the channels may be adjusted.
  6830. RESULT CODEuserCanceledErr    –128    User canceled the dialog    
  6831.  
  6832. SEE ALSO
  6833. You may retrieve or set the configuration of one or more channel components by using the SGGetSettings (described in the next section), SGSetSettings (described on page 5-50), SGGetChannelSettings (described on page 5-51), or SGSetChannelSettings function (described on page 5-52). 
  6834. SGGetSettings
  6835.  
  6836. The SGGetSettings function retrieves the current settings of all channels used by the sequence grabber. The sequence grabber places all of this configuration information into a Movie Toolbox user data list.
  6837. pascal ComponentResult SGGetSettings (SeqGrabComponent s,     
  6838.                                                     UserData *ud, long flags);
  6839. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6840. ud    Contains a pointer. The sequence grabber returns a pointer to a Movie Toolbox user data list that contains the configuration information. Your application is responsible for disposing of this user data list when you are done with it.
  6841. flags    Reserved for Apple. Set this parameter to 0.
  6842. DESCRIPTION
  6843. The SGGetSettings function allows you to retrieve the sequence grabber’s configuration information. The sequence grabber, in turn, retrieves configuration information for each of its channels and stores that information in a Movie Toolbox user data list. You may subsequently use the SGSetSettings function (described in the next section) to reconfigure the sequence grabber. You can store the settings (for example, in a Preferences file) by using the Movie Toolbox’s PutUserDataIntoHandle function.
  6844. RESULT CODES
  6845. Memory Manager errors
  6846. SEE ALSO
  6847. You may retrieve the configuration of one channel component by using the SGGetChannelSettings function (described on page 5-51). 
  6848. SGSetSettings
  6849.  
  6850. The SGSetSettings function allows you to configure a sequence grabber and its channels.
  6851. pascal ComponentResult SGSetSettings (SeqGrabComponent s,
  6852.                                                     UserData ud, long flags);
  6853. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6854. ud    Specifies a Movie Toolbox user data list that contains the configuration information to be used by the sequence grabber.
  6855. flags    Reserved for Apple. Set this parameter to 0.
  6856. DESCRIPTION
  6857. The SGSetSettings function allows you to configure a sequence grabber. You 
  6858. provide this configuration information in a Movie Toolbox user data list. Typically, you obtain this configuration data from the SGGetSettings function, which is discussed in the previous section. 
  6859. Note that the sequence grabber disposes of any of its current channels before applying this configuration information. It then opens connections to new channels as appropriate.
  6860. You can restore saved settings by using the Movie Toolbox’s NewUserDataFromHandle function.
  6861. RESULT CODESnoDeviceForChannel    –9400    Channel component cannot find its device    
  6862. couldntGetRequiredComponent    –9405    Component not found    
  6863. deviceCantMeetRequest    –9408    Device cannot support grabber    
  6864.  
  6865. SEE ALSO
  6866. You may set the configuration of one channel component by using the SGSetChannelSettings function (described on page 5-52).
  6867. You may use the SGGetIndChannel function (described on page 5-33) to obtain information about each channel that the sequence grabber is using as a result of applying this new configuration.
  6868. SGGetChannelSettings
  6869.  
  6870. The SGGetChannelSettings function retrieves the current settings of one channel used by the sequence grabber. The sequence grabber places this configuration information into a Movie Toolbox user data list.
  6871. pascal ComponentResult SGGetChannelSettings (SeqGrabComponent s,                                             
  6872.                                                             SGChannel c,
  6873.                                                             UserData *ud, 
  6874.                                                             long flags);
  6875. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6876. c    Identifies the channel for this operation. You pass your 
  6877. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function, discussed on page 5-31 and page 5-32, respectively.
  6878. ud    Contains a pointer. The sequence grabber returns a pointer to a Movie Toolbox user data list that contains the configuration information.
  6879. flags    Reserved for Apple. Set this parameter to 0.
  6880. DESCRIPTION
  6881. The SGGetChannelSettings function allows you to retrieve the configuration information for a single channel component. The channel component stores 
  6882. that information in a Movie Toolbox user data list. You may subsequently use the SGSetChannelSettings function to reconfigure the channel (this function is described next). 
  6883. RESULT CODES
  6884. Memory Manager errors
  6885. SEE ALSO
  6886. You may retrieve the configuration of the entire sequence grabber, including all of its channels, by using the SGGetSettings function, described on page 5-49.
  6887. SGSetChannelSettings
  6888.  
  6889. The SGSetChannelSettings function allows you to configure a sequence grabber channel.
  6890. pascal ComponentResult SGSetChannelSettings (SeqGrabComponent s,         
  6891.                                                             SGChannel c,
  6892.                                                             UserData ud, 
  6893.                                                             long flags);
  6894. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6895. c    Identifies the channel to be configured. You provide your 
  6896. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function, discussed on page 5-31 and page 5-32, respectively.
  6897. ud    Specifies a Movie Toolbox user data list that contains the configuration information to be used by the channel component.
  6898. flags    Reserved for Apple. Set this parameter to 0.
  6899. DESCRIPTION
  6900. The SGSetChannelSettings function allows you to configure a sequence grabber channel. You provide this configuration information in a Movie Toolbox user data list. Typically, you obtain this configuration data from the SGGetChannelSettings function, which is discussed in the previous section.
  6901. RESULT CODESnoDeviceForChannel    –9400    Channel component cannot find its device    
  6902. couldntGetRequiredComponent    –9405    Component not found    
  6903. deviceCantMeetRequest    –9408    Device cannot support grabber    
  6904.  
  6905. SEE ALSO
  6906. You may set the configuration of all of the sequence grabber’s channels by using the SGSetSettings function. This function is described on page 5-50.
  6907. Working With Sequence Grabber Characteristics
  6908.  
  6909. The characteristics that govern a sequence grabber operation fall into two main categories: those that apply to the sequence grabber component, and those that apply to an individual channel that has been created for the sequence grabber. Sequence grabber components provide a number of functions in each category. This section describes the functions that allow you to configure the characteristics of the sequence grabber component. See “Working With Channel Characteristics” beginning on page 5-58 for information about functions that apply to a single channel.
  6910. Use the SGSetMaximumRecordTime function to limit the duration of a record operation. You can retrieve this time limit by calling the SGGetMaximumRecordTime function.
  6911. The SGSetFlags function allows you to set control flags that govern an operation. 
  6912. Use the SGGetFlags function to retrieve those flags.
  6913. You can obtain information about the progress of a record operation by calling the SGGetStorageSpaceRemaining and SGGetTimeRemaining functions.
  6914. You can retrieve a reference to the time base used by a sequence grabber component by calling the SGGetTimeBase function.
  6915. SGSetMaximumRecordTime
  6916.  
  6917. You can limit the duration of a record operation by calling the SGSetMaximumRecordTime function. You specify the time limit as an exact number of Macintosh system ticks (each is approximately a sixtieth of a second). The most efficient technique for monitoring this time limit is to examine the result code from the SGIdle function, which is described on page 5-39. When the time limit expires, the sequence grabber component sets that result code to grabTimeComplete.
  6918. pascal ComponentResult SGSetMaximumRecordTime (SeqGrabComponent s,
  6919.                                                          unsigned long ticks);
  6920. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6921. ticks    Specifies the maximum duration for the record operation, in system ticks. Set this parameter to 0 to remove the time limit from the operation.
  6922. DESCRIPTION
  6923. By default, there is no time limit on a record operation. If you do not set a limit, a record operation will run until it exhausts the Operating System resources or you call the SGStop function (described on page 5-40). Memory and disk space are the two major limiting factors.
  6924. You must call the SGSetMaximumRecordTime function before you start the record operation.
  6925. SGGetMaximumRecordTime
  6926.  
  6927. The SGGetMaximumRecordTime function allows you to determine the time limit you have set for a record operation.
  6928. pascal ComponentResult SGGetMaximumRecordTime (SeqGrabComponent s,
  6929.                                                          unsigned long *ticks);
  6930. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6931. ticks    Contains a pointer to a long integer that is to receive a value indicating the maximum duration for the record operation, in system ticks. A value of 0 indicates that there is no time limit.
  6932. SEE ALSO
  6933. You set this time limit by calling the SGSetMaximumRecordTime function, which is described in the previous section.
  6934. SGGetStorageSpaceRemaining
  6935.  
  6936. The SGGetStorageSpaceRemaining function allows you to monitor the amount of space remaining for use during a record operation. You can use this function to monitor the space being used so that you can limit the amount of space consumed by an operation. Alternatively, you can use the information you receive from this function to update a status display for the user.
  6937. pascal ComponentResult SGGetStorageSpaceRemaining
  6938.                                                      (SeqGrabComponent s,
  6939.                                                      unsigned long *bytes);
  6940. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6941. bytes    Contains a pointer to a long integer that is to receive a value indicating the amount of space remaining for the current record operation. If you are recording to memory, this value contains information about the amount of memory remaining. If you are recording to a movie file, this value contains information about the amount of storage space available on the device that holds the file.
  6942. DESCRIPTION
  6943. The SGGetStorageSpaceRemaining function returns information that is appropriate for the output conditions you establish with the SGSetDataOutput function, which is described on page 5-26. If you are recording to memory, this function returns information about the amount of memory remaining. If you are recording to a movie file, this function returns information about the amount of storage space available on the device that holds the file.
  6944. You can call this function only after you have started a record operation.
  6945. RESULT CODEseqGrabInfoNotAvailable    –9407    Sequence grabber does not have this information at this time    
  6946.  
  6947. SGGetTimeRemaining
  6948.  
  6949. The SGGetTimeRemaining function allows you to obtain an estimate of the amount of recording time that remains for the current record operation. The sequence 
  6950. grabber component estimates this value based on the amount of storage remaining and the speed with which the record operation is consuming that space. This estimate improves as the record process continues. If you have limited the record time by calling the SGSetMaximumRecordTime function (see page 5-53 for details), SGGetTimeRemaining does not return a value that is greater than the limit you 
  6951. have set.
  6952. pascal ComponentResult SGGetTimeRemaining (SeqGrabComponent s, 
  6953.                                                          long *ticksLeft);
  6954. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6955. ticksLeft    Contains a pointer to a long integer that is to receive a value indicating an estimate of the amount of time remaining for the current record operation. This value is expressed in system ticks.
  6956. DESCRIPTION
  6957. You can call the SGGetTimeRemaining function only after you have started a record operation.
  6958. SPECIAL CONSIDERATIONS
  6959. This function may take a relatively long time to execute. You should not call it too frequently—once per second is reasonable.
  6960. RESULT CODEseqGrabInfoNotAvailable    –9407    Sequence grabber cannot support request    
  6961.  
  6962. SGGetTimeBase
  6963.  
  6964. The SGGetTimeBase function allows you to retrieve a reference to the time base that is being used by a sequence grabber component. 
  6965. pascal ComponentResult SGGetTimeBase (SeqGrabComponent s, 
  6966.                                                     TimeBase *tb);
  6967. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager OpenDefaultComponent or OpenComponent function.
  6968. tb    Contains a pointer to a time base record that is to receive information about the sequence grabber’s time base.
  6969. DESCRIPTION
  6970. You can examine the time base to monitor an operation or to schedule events based on time values. However, you should not change this time base in any way.
  6971. SGSetFlags
  6972.  
  6973. The SGSetFlags function allows you to pass control information about the current operation to the sequence grabber component.
  6974. pascal ComponentResult SGSetFlags (SeqGrabComponent s, 
  6975.                                                 long sgFlags);
  6976. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6977. sgFlags    Contains flags for the current operation. The following flag is defined (set unused flags to 0):
  6978. sgFlagControlledGrab
  6979. Informs the sequence grabber component that you are working with a frame-addressable device to perform a controlled record operation. The sequence grabber and its channel components optimize their operation for this situation. This flag allows the sequence grabber component to trade off speed and quality. Set this flag to 1 if you are performing a controlled grab using a frame-addressable source device.
  6980. SGGetFlags
  6981.  
  6982. You can retrieve a sequence grabber’s control flags by calling the SGGetFlags function. 
  6983. pascal ComponentResult SGGetFlags (SeqGrabComponent s, 
  6984.                                                 long *sgFlags) ;
  6985. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  6986. sgFlags    Contains a pointer to a long integer that is to receive the control flags for the current operation. The following flag is defined (unused flags are set to 0):
  6987. sgFlagControlledGrab
  6988. Informs the sequence grabber component that you are working with a frame-addressable device to perform a controlled record operation. The sequence grabber and its channel components optimize their operation for this situation. This flag allows the sequence grabber component to trade off speed and quality. This flag is set to 1 if you are performing a controlled grab using a frame-addressable source device.
  6989. SEE ALSO
  6990. You set these flags by calling the SGSetFlags function, which is described in the previous section.
  6991. Working With Channel Characteristics
  6992.  
  6993. Sequence grabber components use channel components to obtain digitized data from external media. After you create a channel for a sequence grabber component (by calling the SGNewChannel function, which is described on page 5-31), you must configure that channel before you start a preview or record operation. The sequence grabber component provides a number of functions that allow you to configure the characteristics of a channel component. Several of these functions work on any channel component. This section discusses these general channel configuration functions.
  6994. In addition, sequence grabber components provide functions that are specific to the channel type. Apple currently provides two types of channel components: video channel components and sound channel components. See “Working With Video Channels” beginning on page 5-77 for information about the sequence grabber configuration functions that work only with video channels. See “Working With Sound Channels” beginning on page 5-92 for information about the sequence grabber configuration functions that work only with sound channels.
  6995. Use the SGSetChannelUsage function to specify how a channel is to be used. You can restrict a channel to use during record or preview operations. In addition, this function allows you to specify whether a channel plays during a record operation. The SGGetChannelUsage function enables you to determine a channel’s usage.
  6996. The SGGetChannelInfo function allows you to determine whether a channel has a visual or an audio representation.
  6997. The SGSetChannelPlayFlags function allows you to influence the speed 
  6998. and quality with which the sequence grabber displays captured data. The SGGetChannelPlayFlags function lets you determine these flag settings.
  6999. The SGSetChannelMaxFrames function establishes a limit on the number of frames that the sequence grabber will capture from a channel. The SGGetChannelMaxFrames function allows you to determine that limit.
  7000. The SGSetChannelBounds function allows you to set the display boundary rectangle for a channel. Use the SGGetChannelBounds function to determine a channel’s boundary rectangle.
  7001. The SGSetChannelVolume function allows you to control a channel’s sound volume. Use the SGGetChannelVolume function to determine a channel’s volume.
  7002. The SGSetChannelRefCon function allows you to set the value of a reference constant that is passed to your callback functions (see “Video Channel Callback Functions” beginning on page 5-99 for information about the callback functions that are supported by video channels).
  7003. Use the SGGetChannelSampleDescription function to retrieve a channel’s sample description. The SGGetChannelTimeScale function allows you to obtain the channel’s time scale.
  7004. You can modify or retrieve the channel’s clipping region by calling the SGSetChannelClip or SGGetChannelClip function, respectively. You can work with a channel’s transformation matrix by calling the SGSetChannelMatrix and SGGetChannelMatrix functions.
  7005. SGSetChannelUsage
  7006.  
  7007. The SGSetChannelUsage function specifies how a channel is to be used by the sequence grabber component. The sequence grabber component does not use a channel until you specify how it is to be used. You can specify that a channel is to be used for recording or previewing, or both. In addition, you can control whether the data captured by a channel is displayed during the record or preview operation. 
  7008. pascal ComponentResult SGSetChannelUsage (SGChannel c, 
  7009.                                                         long usage);
  7010. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7011. usage    Contains flags (defined by the SeqGrabUsageEnum data type) specifying how the channel is to be used. You may set more than one of these flags 
  7012. to 1. Set unused flags to 0. The following flags are defined:
  7013. seqGrabRecord
  7014. Indicates that the channel is to be used during record operations. Set this flag to 1 to use a channel for recording.
  7015. seqGrabPreview
  7016. Indicates that the channel is to be used during preview operations. Set this flag to 1 to use a channel for previewing.
  7017. seqGrabPlayDuringRecord
  7018. Indicates that the sequence grabber may play the data captured by this channel during a record operation. If you set this flag to 1, the data from the channel may be played during the record operation, if the destination buffer is onscreen. Video data is displayed; sound data is played through the computer’s speaker. However, playing the data may affect the quality of the recorded sequence by causing frames to be dropped. Set this flag to 0 to prevent the channel’s data from being played during a record operation.
  7019. DESCRIPTION
  7020. You cannot call the SGSetChannelUsage function during a record or preview operation.
  7021. RESULT CODESnotEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  7022. notEnoughDiskSpaceToGrab    –9404    Insufficient disk space for record operation    
  7023. deviceCantMeetRequest    –9408    Device cannot support grabber    
  7024.  
  7025. SGGetChannelUsage
  7026.  
  7027. The SGGetChannelUsage function allows you to determine how a channel is to be used by the sequence grabber component. 
  7028. pascal ComponentResult SGGetChannelUsage (SGChannel c,
  7029.                                                         long *usage);
  7030. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7031. usage    Contains a pointer to flags indicating how the channel is to be used. More than one flag may be set to 1; unused flags are set to 0. The following flags are defined:
  7032. seqGrabRecord
  7033. Indicates that the channel is used during record operations.
  7034. seqGrabPreview
  7035. Indicates that the channel is used during preview operations.
  7036. seqGrabPlayDuringRecord
  7037. Indicates that the sequence grabber component plays the data captured by this channel during a record operation. 
  7038. SEE ALSO
  7039. You establish a channel’s usage by calling the SGSetChannelUsage function, described in the previous section.
  7040. SGGetChannelInfo
  7041.  
  7042. The SGGetChannelInfo function allows you to determine how a channel’s data is represented to the user—as visual or audio data, or both. 
  7043. pascal ComponentResult SGGetChannelInfo (SGChannel c, 
  7044.                                                         long *channelInfo);
  7045. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7046. channelInfo
  7047. Contains a pointer to a long integer that is to receive channel information flags. More than one flag may be set to 1. Unused flags are set to 0. The following flags are defined:
  7048. seqGrabHasBounds
  7049. Indicates that the channel has a visual representation. If this flag is set to 1, the channel has a visual representation.
  7050. seqGrabHasVolume
  7051. Indicates that the channel has an audio representation. If this flag is set to 1, the channel has an audio representation.
  7052. seqGrabHasDiscreteSamples
  7053. Indicates that the channel data is organized into discrete frames. If this flag is set to 1, you can use the SGSetChannelMaxFrames function (see page 5-63) to limit the number of frames processed in a record operation or the rate at which those frames are processed. If this flag is set to 0, the channel data is not organized into frames. Therefore, you can only limit a record operation by setting the maximum time for the operation.
  7054. SGSetChannelPlayFlags
  7055.  
  7056. The SGSetChannelPlayFlags function allows you to influence the speed and quality with which the sequence grabber displays data from a channel.
  7057. pascal ComponentResult SGSetChannelPlayFlags (SGChannel c, 
  7058.                                                              long playFlags);
  7059. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7060. playFlags    Specifies a long integer that contains flags that influence channel playback. The following values are defined—you must use one of these values:
  7061. channelPlayNormal
  7062. Instructs the channel component to use its default playback methodology.
  7063. channelPlayFast
  7064. Instructs the channel component to sacrifice playback quality in order to achieve the specified playback rate.
  7065. channelPlayHighQuality 
  7066. Instructs the channel component to play the channel’s data at the highest possible quality—this option sacrifices playback rate for the sake of image quality. This option may reduce the amount of processor time available for recording. This option does not affect the quality of 
  7067. the recorded data, however.
  7068.     The following flag is defined—you may use this flag with any of the values defined for this parameter (set unused flags to 0):
  7069. channelPlayAllData
  7070. Instructs the channel component to try to play all of the data it captures, even the data that is stored in offscreen buffers. This option is useful when you want to be sure that the user sees as much of the captured data as possible. Set this flag to 1 to play all the captured data. You may combine this flag with any of the values defined for the playFlags parameter.
  7071. DESCRIPTION
  7072. The SGSetChannelPlayFlags function does not affect the quality of a record operation.
  7073. SPECIAL CONSIDERATIONS
  7074. You cannot call this function during a record operation; you can call it during a preview operation.
  7075. SGGetChannelPlayFlags
  7076.  
  7077. The SGGetChannelPlayFlags function allows you to retrieve the playback control flags that you set with the SGSetChannelPlayFlags function, which is described in the previous section.
  7078. pascal ComponentResult SGGetChannelPlayFlags (SGChannel c, 
  7079.                                                              long *playFlags);
  7080. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7081. playFlags    Contains a pointer to a long integer that is to receive flags that influence channel playback. The following values are defined:
  7082. channelPlayNormal
  7083. The channel component uses its default playback methodology.
  7084. channelPlayFast
  7085. The channel component sacrifices playback quality in order to achieve the specified playback rate.
  7086. channelPlayHighQuality 
  7087. The channel component plays the channel’s data at the highest possible quality—this option sacrifices playback rate for the sake of image quality. This option may reduce the amount of processor time available for recording. This option does not affect the quality of the recorded data, however.
  7088.     The following flag is defined and may be used with any of the values defined for this parameter (unused flags are set to 0):
  7089. channelPlayAllData
  7090. The channel component tries to play all of the data it captures, even the data that is stored in offscreen buffers. This option is useful when you want to be sure that the user sees as much of the captured data as possible.
  7091. SGSetChannelMaxFrames
  7092.  
  7093. The SGSetChannelMaxFrames function allows you to limit the number of frames 
  7094. that the sequence grabber will capture from a specified channel. This function works only with channels that have data that is organized into frames, such as video data from a video disc. 
  7095. pascal ComponentResult SGSetChannelMaxFrames (SGChannel c, 
  7096.                                                              long frameCount);
  7097. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7098. frameCount
  7099. Specifies the maximum number of frames to capture during the preview or record operation. Set this value to –1 to remove the limit.
  7100. DESCRIPTION
  7101. You can use the SGSetChannelMaxFrames function in the context of a time-based function to control the number of frames you collect for each unit of time. For example, if you want to collect one frame of data per second, you can create a function that executes once per second. That function should call SGSetChannelMaxFrames to set the maximum frame count to 1. Your application can determine when the frame is captured by calling the SGGetChannelMaxFrames function and detecting when that function returns a value of 0. The SGGetChannelMaxFrames function is described in the next section.
  7102. You may use this function only after you have prepared the sequence grabber component for a record operation or during an active record operation. Note that sequence grabber components clear this value when you prepare for a record operation.
  7103. SEE ALSO
  7104. You can determine whether a channel’s data is organized into frames by calling the SGGetChannelInfo function, which is described on page 5-61.
  7105. RESULT CODESparamErr    –50    Invalid parameter specified    
  7106. cantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7107.  
  7108. SGGetChannelMaxFrames
  7109.  
  7110. The SGGetChannelMaxFrames function allows you to determine the number of frames left to be captured from a specified channel. 
  7111. pascal ComponentResult SGGetChannelMaxFrames (SGChannel c, 
  7112.                                                              long *frameCount);
  7113. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7114. frameCount
  7115. Contains a pointer to a long integer that is to receive a value specifying the number of frames left to be captured during the preview or record operation. If the returned value is –1, the sequence grabber captures as many frames as it can.
  7116. SEE ALSO
  7117. You set the starting value by calling the SGSetChannelMaxFrames function, which is described in the previous section.
  7118. RESULT CODEseqGrabInfoNotAvailable    –9407    Sequence grabber component cannot support request    
  7119.  
  7120. SGSetChannelBounds
  7121.  
  7122. The SGSetChannelBounds function allows you to specify a channel’s display boundary rectangle. This rectangle defines the destination for data from this channel. This rectangle is defined in the graphics world you establish by calling the SGSetGWorld function, described on page 5-29.
  7123. pascal ComponentResult SGSetChannelBounds (SGChannel c,
  7124.                                                          const Rect *bounds);
  7125. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7126. bounds    Contains a pointer to a rectangle that defines the channel’s display boundary rectangle. This rectangle is defined in the graphics world you establish when you call the SGSetGWorld function, described on page 5-29.
  7127. DESCRIPTION
  7128. You cannot call the SGSetChannelBounds function during a record operation. 
  7129. SPECIAL CONSIDERATIONS
  7130. The SGSetChannelBounds function adjusts the channel matrix, as appropriate.
  7131. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7132. notEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  7133. deviceCantMeetRequest    –9408    Device cannot support grabber component    
  7134.  
  7135. SGGetChannelBounds
  7136.  
  7137. The SGGetChannelBounds function allows you to determine a channel’s display boundary rectangle. 
  7138. pascal ComponentResult SGGetChannelBounds (SGChannel c,
  7139.                                                          Rect *bounds);
  7140. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7141. bounds    Contains a pointer to a rectangle structure that is to receive information about the channel’s display boundary rectangle. This rectangle is defined in the graphics world that you establish when you call the SGSetGWorld function.
  7142. DESCRIPTION
  7143. You set the boundary rectangle by calling the SGSetChannelBounds function, which is described in the previous section. This rectangle is defined in the graphics world that you establish by calling the SGSetGWorld function, described on page 5-29.
  7144. SGSetChannelVolume
  7145.  
  7146. The SGSetChannelVolume function sets a channel’s sound volume. 
  7147. pascal ComponentResult SGSetChannelVolume (SGChannel c,
  7148.                                                          short volume);
  7149. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7150. volume    Specifies the volume setting of the channel represented as a 16-bit, fixed-point number. The high-order 8 bits contain the integer part of the value; the low-order 8 bits contain the fractional part. Volume values range from –1.0 to 1.0. Negative values play no sound but preserve the absolute value of the volume setting.
  7151. DESCRIPTION
  7152. The sequence grabber component uses this volume setting during playback—this setting does not affect the record level or the volume of the track in the recorded QuickTime movie.
  7153. SGGetChannelVolume
  7154.  
  7155. The SGGetChannelVolume function allows you to determine a channel’s sound volume setting. 
  7156. pascal ComponentResult SGGetChannelVolume (SGChannel c,
  7157.                                                          short *volume);
  7158. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7159. volume    Contains a pointer to an integer that is to receive the volume setting of the channel represented as a 16-bit, fixed-point number. The high-order 8 bits contain the integer part of the value; the low-order 8 bits contain the fractional part. Volume values range from –1.0 to 1.0. Negative values play no sound but preserve the absolute value of the volume setting.
  7160. SEE ALSO
  7161. You establish the volume setting by calling the SGSetChannelVolume function, described in the previous section.
  7162. SGSetChannelRefCon
  7163.  
  7164. The SGSetChannelRefCon function allows you to set the value of a reference constant that is passed to your callback functions (see “Video Channel Callback Functions” beginning on page 5-99 for information about the callback functions that are supported by video channels).
  7165. pascal ComponentResult SGSetChannelRefCon (SGChannel c, 
  7166.                                                          long refCon);
  7167. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7168. refCon    Specifies a reference constant value that is to be passed to your callback functions for this channel. See “Video Channel Callback Functions” on page 5-99 for information about the callback functions that are supported by video channels. Sound channels do not support callback functions.
  7169. SPECIAL CONSIDERATIONS
  7170.  Sound channels do not support callback functions.
  7171. SGGetChannelSampleDescription
  7172.  
  7173. The SGGetChannelSampleDescription function allows you to retrieve a channel’s sample description.
  7174. pascal ComponentResult SGGetChannelSampleDescription 
  7175.                                             (SGChannel c, Handle sampleDesc);
  7176. c    Identifies the channel for this operation. You provide your 
  7177. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function, described on page 5-31 and page 5-32, respectively.
  7178. sampleDesc    Specifies a handle that is to receive the sample description.
  7179. DESCRIPTION
  7180. The SGGetChannelSampleDescription function allows you to retrieve a channel’s current sample description. You may call this function only when the channel is prepared to record or is actually recording.
  7181. The channel returns a sample description that is appropriate to the type of data being captured. For video channels, the channel component returns an Image Compression Manager image description structure; for sound channels, you receive a sound description structure, as defined by the Movie Toolbox.
  7182. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7183.  
  7184. SGGetChannelTimeScale
  7185.  
  7186. The SGGetChannelTimeScale function allows you to retrieve a channel’s time scale.
  7187. pascal ComponentResult SGGetChannelTimeScale (SGChannel c,                                                                 
  7188.                                                              TimeScale *scale);
  7189. c    Identifies the channel for this operation. You provide your 
  7190. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function; these functions are described on page 5-31 and page 5-32, respectively.
  7191. scale    Contains a pointer to a time scale structure. The channel component places information about its time scale into this structure.
  7192. DESCRIPTION
  7193. The time scale you obtain by calling the SGGetChannelTimeScale typically corresponds to the time scale of the media that has been created by the channel. You can use this time scale in your data function, which you assign with the SGSetDataProc function (discussed on page 5-35).
  7194. SGSetChannelClip
  7195.  
  7196. The SGSetChannelClip function allows you to set a channel’s clipping region.
  7197. pascal ComponentResult SGSetChannelClip (SGChannel c, 
  7198.                                                          RgnHandle theClip);
  7199. c    Identifies the channel for this operation. You provide your 
  7200. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function, described on page 5-31 and page 5-32, respectively.
  7201. theClip    Contains a handle to the new clipping region. Set this parameter to nil to remove the current clipping region. The channel component makes a copy of this handle; it is your application’s responsibility to dispose of this handle when you are finished with it.
  7202. DESCRIPTION
  7203. The SGSetChannelClip function allows you to apply a clipping region to a channel’s display region. By default, channel components do not apply a clipping region to 
  7204. their displayed image. 
  7205. SEE ALSO
  7206. You may retrieve a channel’s clipping region by calling the SGGetChannelClip function, described in the next section.
  7207. SGGetChannelClip
  7208.  
  7209. The SGGetChannelClip function allows you to retrieve a channel’s clipping region.
  7210. pascal ComponentResult SGGetChannelClip (SGChannel c, 
  7211.                                                         RgnHandle *theClip);
  7212. c    Identifies the channel for this operation. You provide your 
  7213. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function, described on page 5-31 and page 5-32, respectively.
  7214. theClip    Contains a pointer to a handle that is to receive the clipping region. Your application is responsible for disposing of this handle. If there is no clipping region, the channel component sets this handle to nil. 
  7215. Note
  7216. Some devices may not support clipping.u
  7217. SEE ALSO
  7218. You may set a channel’s clipping region by calling the SGSetChannelClip function, which is discussed in the previous section.
  7219. SGSetChannelMatrix
  7220.  
  7221. The SGSetChannelMatrix function allows you to set a channel’s display transformation matrix.
  7222. pascal ComponentResult SGSetChannelMatrix (SGChannel c, 
  7223.                                                         const MatrixRecord *m);
  7224. c    Identifies the channel for this operation. You provide your 
  7225. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function, discussed on page 5-31 and page 5-32, respectively.
  7226. m    Contains a pointer to a matrix structure, as defined by the Movie Toolbox (see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for more information about matrix structures). Set this parameter to nil to select the identity matrix.
  7227. DESCRIPTION
  7228. The SGSetChannelMatrix function allows you to specify a display transformation matrix for a video channel. The channel uses this matrix to transform its video image into the destination window. If the channel cannot accommodate your matrix, it returns an appropriate result code. Note that you may not call this function when you are recording.
  7229. Other channel component functions may affect this matrix. The SGSetChannelBounds function sets the matrix values so that the matrix maps the channel’s output to the channel’s boundary rectangle (this function is discussed beginning on page 5-65). The SGSetVideoRect function modifies the matrix so that the specified video rectangle appears in the existing destination rectangle (see page 5-78 for more information about this function).
  7230. RESULT CODESmatrixErr    –2203    Invalid matrix    
  7231. deviceCantMeetRequest    –9408    Device cannot support grabber    
  7232.  
  7233. SEE ALSO
  7234. You may retrieve a channel’s matrix by calling the SGGetChannelMatrix function, which is discussed next.
  7235. SGGetChannelMatrix
  7236.  
  7237. The SGGetChannelMatrix function allows you to retrieve a channel’s display transformation matrix.
  7238. pascal ComponentResult SGGetChannelMatrix (SGChannel c,         
  7239.                                                          MatrixRecord *m);
  7240. c    Identifies the channel for this operation. You provide your 
  7241. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function, described on page 5-31 and page 5-32, respectively.
  7242. m    Contains a pointer to a matrix structure, as defined by the Movie Toolbox (see “Movie Toolbox” in Inside Macintosh: QuickTime for more information about matrix structures). The channel component places its current matrix values into this matrix structure.
  7243. SEE ALSO
  7244. You may set a channel’s matrix by calling the SGSetChannelMatrix function, which is discussed in the previous section.
  7245. Working With Channel Devices
  7246.  
  7247. Sequence grabbers provide a number of functions that allow you to determine the device that is attached to a given sequence grabber channel. These devices allow the channel component to control the digitizing equipment. For example, video channels use video digitizer components, and sound channels use sound input drivers. Your application can use these routines to present a list of available devices to the user, allowing the user to select a specific device for each channel.
  7248. You may use the SGGetChannelDeviceList function to retrieve a list of devices that may be used with a specified channel. You dispose of this device list by calling the SGDisposeDeviceList function. You can place one or more device names into a menu by calling the SGAppendDeviceListToMenu function. You can use the SGSetChannelDevice function to assign a device to a channel.
  7249. Some of these functions use a device list structure to pass information about one or more channel devices. The SGDeviceListRecord data type defines the format of the device list structure.
  7250. typedef struct SGDeviceListRecord {
  7251.     short                    count;                        /* count of devices */
  7252.     short                    selectedIndex;                        /* current device */
  7253.     long                    reserved;                        /* set to 0 */
  7254.     SGDeviceName                    entry[1];                        /* device names */
  7255. } SGDeviceListRecord, *SGDeviceListPtr, **SGDeviceList;
  7256. Field descriptions
  7257. count    Indicates the number of devices described by this structure. The value of this field corresponds to the number of entries in the device name array defined by the entry field.
  7258. selectedIndex    Identifies the currently active device. The value of this field corresponds to the appropriate entry in the device name array defined by the entry field. Note that this value is 0-relative; that is, the first entry has an index number of 0, the second’s value is 1, and so on.
  7259. reserved    Reserved for Apple. Always set to 0.
  7260. entry    Contains an array of device name structures. Each structure corresponds to one valid device. The count field indicates the number of entries in this array. The SGDeviceName data type defines the format of a device name structure; this data type is discussed next.
  7261. Device list structures contain an array of device name structures. Each device name structure identifies a single device that may be used by the channel. The SGDeviceName data type defines the format of a device name structure.
  7262. typedef struct SGDeviceName {    
  7263.     Str63                name;                        /* device name */
  7264.     Handle                icon;                        /* device icon */
  7265.     long                flags;                        /* flags */
  7266.     long                refCon;                        /* set to 0 */
  7267.     long                reserved;                        /* set to 0 */
  7268. } SGDeviceName;
  7269. Field descriptions
  7270. name    Contains the name of the device. For video digitizer components, this field contains the component’s name as specified in the component resource. For sound input drivers, this field contains the driver name. 
  7271. icon    Contains a handle to the device’s icon. Some devices may support an icon, which you may choose to present to the user. If the device does not support an icon, or if you choose not to retrieve this information (by setting the sgDeviceListWithIcons flag to 0 when you call the SGGetChannelDeviceList function), this field is set to nil.
  7272. flags    Reflects the current status of the device. The sequence grabber sets these flags when you retrieve a device list. The following flag is defined:
  7273. sgDeviceNameFlagDeviceUnavailable
  7274. When set to 1, this flag indicates that this device is not currently available.
  7275. refCon    Reserved for Apple. Always set to 0.
  7276. reserved    Reserved for Apple. Always set to 0.
  7277. SGGetChannelDeviceList
  7278.  
  7279. The SGGetChannelDeviceList function allows you to retrieve a list of the devices that are valid for a specified channel.
  7280. pascal ComponentResult SGGetChannelDeviceList (SGChannel c,     
  7281.                                                             long selectionFlags, 
  7282.                                                             SGDeviceList *list);
  7283. c    Identifies the channel for this operation. You provide your 
  7284. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function, discussed on page 5-31 and page 5-32, respectively.
  7285. selectionFlags    
  7286. Controls the data returned for each device. The following flags are defined:
  7287. sgDeviceListWithIcons
  7288. Specifies whether you want to retrieve an icon for each device. If you set this flag to 1, the sequence grabber returns an icon for each device in the list, in the icon field. If you set this flag to 0, the sequence grabber sets the icon fields to 0.
  7289. sgDeviceListDontCheckAvailability
  7290. Controls whether the sequence grabber verifies 
  7291. that each device is currently available. If you set this 
  7292. flag to 1, the sequence grabber does not check the availability of each device. Otherwise, the sequence grabber checks each device’s availability, and sets the sgDeviceNameFlagDeviceUnavailable flag appropriately in each device name structure that is returned.
  7293.     Note that checking device availability slows this function. In general, however, you should check availability if you plan to present a list of devices to the user. Otherwise, the user may select a device that is unavailable.
  7294. list    Defines a pointer to a device list structure pointer. The sequence grabber creates a device name structure and returns a pointer to that structure in the field referred to by this parameter. When you are done with the list, use the SGDisposeDeviceList function (described in the next section) to dispose of the memory used by the list.
  7295. DESCRIPTION
  7296. This function allows you to retrieve a list of the devices that may be used with a channel. Each entry in this list identifies a valid device by name. Your application may then place these device names into a menu using the SGAppendDeviceListToMenu function, which is described on page 5-75.
  7297. This function can be useful for retrieving the name of the current device. Retrieve the device list and use the selectedIndex field to determine which device is currently 
  7298. in use.
  7299. RESULT CODES
  7300. Memory Manager errors
  7301. SEE ALSO
  7302. When you are done with the list, use the SGDisposeDeviceList function to dispose of the memory used by the list. This function is discussed next.
  7303. SGDisposeDeviceList
  7304.  
  7305. The SGDisposeDeviceList function allows you to dispose of a device list.
  7306. pascal ComponentResult SGDisposeDeviceList (SeqGrabComponent s,
  7307.                                                              SGDeviceList list);
  7308. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  7309. list    Defines a pointer to a device list structure pointer. The sequence grabber disposes of the memory used by the device list structure.
  7310. DESCRIPTION
  7311. You must use this function to dispose of the memory used by a device list structure. Do not use Memory Manager functions to do so.
  7312. RESULT CODES
  7313. Memory Manager errors
  7314. SGAppendDeviceListToMenu
  7315.  
  7316. The SGAppendDeviceListToMenu function allows you to place a list of device names into a specified menu.
  7317. pascal ComponentResult SGAppendDeviceListToMenu 
  7318.                                     (SeqGrabComponent s, 
  7319.                                     SGDeviceList list, MenuHandle mh);
  7320. s    Specifies the component instance that identifies your connection to the sequence grabber component. You obtain this value from the Component Manager’s OpenDefaultComponent or OpenComponent function.
  7321. list    Defines a pointer to a device list structure pointer. The sequence grabber appends the name of each device in the list to the menu specified by the mh parameter. If the sgDeviceNameFlagDeviceUnavailable flag is set to 1 for a device in the list, the sequence grabber disables the menu item corresponding to that device.
  7322. mh    Specifies the menu to which the device names are to be appended.
  7323. DESCRIPTION
  7324. You may use the SGAppendDeviceListToMenu function to present a list of valid devices to the user. The user may then select a device from the list. You can assign 
  7325. that device to a channel by calling the SGSetChannelDevice function. Note that, if you choose to have the sequence grabber check the availability of each device (by setting the sgDeviceListDontCheckAvailability flag to 0 with the SGGetChannelDeviceList function), the sequence grabber will disable menu 
  7326. items that correspond to unavailable devices. This prevents the user from selecting a device that cannot be used.
  7327. RESULT CODEparamErr    –50    Invalid parameter value    
  7328.  
  7329. SEE ALSO
  7330. You obtain the device list by calling the SGGetChannelDeviceList function, which is discussed on page 5-73.
  7331. SGSetChannelDevice
  7332.  
  7333. The SGSetChannelDevice function allows you to assign a device to a channel.
  7334. pascal ComponentResult SGSetChannelDevice (SGChannel c, 
  7335.                                                             StringPtr name);
  7336. c    Identifies the channel for this operation. You provide your 
  7337. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function, discussed on page 5-31 and page 5-32, respectively.
  7338. name    Points to the device’s name string. This name is contained in the name field of the appropriate device name structure in the device list.
  7339. DESCRIPTION
  7340. When you call the SGSetChannelDevice function, the sequence grabber channel tries to use the specified device, in place of the device currently in use. You must obtain the device name from the channel’s device list.
  7341. RESULT CODESparamErr    –50    Invalid parameter value    
  7342. deviceCantMeetRequest    –9408    Device cannot support grabber    
  7343.  
  7344. SEE ALSO
  7345. You obtain the device list by calling the SGGetChannelDeviceList function, which is described on page 5-73.
  7346. Working With Video Channels
  7347.  
  7348. Sequence grabber components provide a number of functions that allow you to configure the grabber’s video channels. This section describes these configuration functions, which you can use only with video channels. You can determine whether a channel has a visual representation by calling the SGGetChannelInfo function, which is described on page 5-61. If you want to configure a sound channel, use the functions described in “Working With Sound Channels” beginning on page 5-92. If you want to configure general attributes of a channel, use the functions described in “Working With Channel Characteristics” beginning on page 5-58.
  7349. The SGGetSrcVideoBounds function allows you to determine the coordinates of the source video boundary rectangle. This rectangle defines the size of the source video image being captured by the video channel. You can use the SGSetVideoRect function to specify a part of the source video boundary rectangle to be captured by the channel. The SGGetVideoRect function allows you to determine the active source video rectangle.
  7350. Typically, the sequence grabber component uses the Image Compression Manager 
  7351. to compress the video data it captures. You can control many aspects of this image- compression process. Use the SGSetVideoCompressorType function to specify the type of image compressor to use. You can determine the type of image compressor currently in use by calling the SGGetVideoCompressorType function. You can specify a particular image compressor and set many image-compression parameters by calling the SGSetVideoCompressor function. You can determine which image compressor is being used and its parameter settings by calling the SGGetVideoCompressor function.
  7352. The channel components that supply video data to a sequence grabber 
  7353. component typically work with a video digitizer component (see the chapter 
  7354. “Video Digitizer Components” in this book for a complete description of video 
  7355. digitizer components). Sequence grabber components provide functions that allow 
  7356. you to work with a channel’s video digitizer component. You can use the SGGetVideoDigitizerComponent function to determine which video digitizer component is supplying data to a specified channel component. You can set a channel’s video digitizer by calling the SGSetVideoDigitizerComponent function. If you change any video digitizer settings by calling the video digitizer component directly, you should inform the sequence grabber component by calling the SGVideoDigitizerChanged function.
  7357. Some video source data may contain unacceptable levels of visual noise or artifacts. One technique for removing this noise is to capture the image and then reduce it in size. During the size reduction process, the noise can be filtered out. Sequence grabber components provide functions that allow you to filter the input video data. 
  7358. The SGSetCompressBuffer function sets a filter buffer for a video channel. The SGGetCompressBuffer function returns information about your filter buffer.
  7359. You can work with a video channel’s frame rate by calling the SGSetFrameRate and SGGetFrameRate functions. You can control whether a channel uses an offscreen buffer by calling the SGSetUseScreenBuffer and SGGetUseScreenBuffer functions.
  7360. SGGetSrcVideoBounds
  7361.  
  7362. The SGGetSrcVideoBounds function allows you to determine the size of the source video boundary rectangle. This rectangle defines the size of the source video image. 
  7363. For video channel components that work with video digitizer components, this rectangle corresponds to the video digitizer’s active source rectangle (see the chapter “Video Digitizer Components” in this book for more information).
  7364. pascal ComponentResult SGGetSrcVideoBounds (SGChannel c, Rect *r);
  7365. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7366. r    Contains a pointer to a rectangle structure that is to receive information about the source video boundary rectangle.
  7367. RESULT CODEparamErr    –50    Invalid parameter specified    
  7368.  
  7369. SGSetVideoRect
  7370.  
  7371. The SGSetVideoRect function allows you to specify a part of the source video image that is to be captured by the sequence grabber component. This rectangle must reside within the boundaries of the source video boundary rectangle. You obtain the dimensions of the source video boundary rectangle by calling the SGGetSrcVideoBounds function, described in the previous section. If you do not use this function to set a source rectangle, the sequence grabber component captures the entire video image, as defined by the source video boundary rectangle.
  7372. pascal ComponentResult SGSetVideoRect (SGChannel c, Rect *r);
  7373. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7374. r    Contains a pointer to the dimensions of the rectangle that defines the portion of the source video image to be captured. This rectangle must lie within the boundaries of the source video boundary rectangle, which you can obtain by calling the SGGetSrcVideoBounds function.
  7375. DESCRIPTION
  7376. For video channel components that receive their data from video digitizer components, this function sets the video digitizer component’s digitizer rectangle. See the chapter “Video Digitizer Components” in this book for information about video digitizer components.
  7377. You cannot call this function during a record operation.
  7378. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7379. notEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  7380.  
  7381. SGGetVideoRect
  7382.  
  7383. The SGGetVideoRect function allows you to determine the portion of the source video image that is to be captured. Use the SGSetVideoRect function, which is described in the previous section, to set the dimensions of this rectangle. 
  7384. pascal ComponentResult SGGetVideoRect (SGChannel c, Rect *r);
  7385. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7386. r    Contains a pointer to a rectangle structure that is to receive the dimensions of the rectangle that defines the portion of the source video image to be captured. 
  7387. DESCRIPTION
  7388. If you have not set a source rectangle, the sequence grabber captures the entire source video image, as defined by the source video boundary rectangle. 
  7389. SEE ALSO
  7390. You can obtain the dimensions of the source video boundary rectangle by calling the SGGetSrcVideoBounds function, described on page 5-78.
  7391. SGSetVideoCompressorType
  7392.  
  7393. The SGSetVideoCompressorType function allows you to specify the type of image compression to be applied to the captured video images.
  7394. pascal ComponentResult SGSetVideoCompressorType (SGChannel c,
  7395.                                                          OSType compressorType);
  7396. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7397. compressorType
  7398. Specifies the type of image compression to use. The value of this parameter must correspond to one of the image compressor types supported by the Image Compression Manager. Currently, six CodecType values are provided by Apple. You should use the GetCodecNameList function to retrieve these names, so that your application can take advantage of new compressor types that may be added in the future. For each CodecType value in the following list, the corresponding compression method is also identified by its text 
  7399. string name.
  7400.     Compressor type    Compressor name    
  7401.     'rpza'    video compressor     
  7402.     'jpeg'    photo compressor     
  7403.     'rle '    animation compressor     
  7404.     'raw '    raw compressor    
  7405.     'smc '    graphics compressor    
  7406.     'cvid'    compact video compressor    
  7407.  
  7408.     See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for information about valid compressor types. If this value is set to 0, the default compression type is selected.
  7409. DESCRIPTION
  7410. In addition, the SGSetVideoCompressorType function resets all image-compression parameters to their default values. You can then use the SGSetVideoCompressor function, described on page 5-82, to change the compression parameters.
  7411. SPECIAL CONSIDERATIONS
  7412. You cannot call the SGSetVideoCompressorType function during a record operation or after you have prepared the sequence grabber component for a record operation (by calling the SGPrepare function, described on page 5-43).
  7413. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7414. notEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  7415. deviceCantMeetRequest    –9408    Device cannot support grabber    
  7416.  
  7417. SGGetVideoCompressorType
  7418.  
  7419. The SGGetVideoCompressorType function allows you to determine the type of image compression that is being applied to a channel’s video data.
  7420. pascal ComponentResult SGGetVideoCompressorType (SGChannel c,
  7421.                                                      OSType *compressorType);
  7422. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7423. compressorType
  7424. Contains a pointer to an OSType field that is to receive information about the type of image compression to use. The returned value must correspond to one of the image compressor types supported by the Image Compression Manager. Currently, six CodecType values are provided by Apple. You should use the GetCodecNameList function to retrieve these names, so that your application can take advantage of new compressor types that may be added in the future. For each CodecType value in the following list, the corresponding compression method is also identified by its text string name.
  7425.     Compressor type    Compressor name    
  7426.     'rpza'    video compressor     
  7427.     'jpeg'    photo compressor     
  7428.     'rle '    animation compressor     
  7429.     'raw '    raw compressor    
  7430.     'smc '    graphics compressor    
  7431.     'cvid'    compact video compressor    
  7432.  
  7433.     See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for information about valid compressor types.
  7434. SEE ALSO
  7435. You can set the image-compression type by calling the SGSetVideoCompressorType function, which is described in the previous section.
  7436. SGSetVideoCompressor
  7437.  
  7438. The SGSetVideoCompressor function allows you to specify many of the parameters that control image compression of the video data captured by a video channel. 
  7439. pascal ComponentResult SGSetVideoCompressor (SGChannel c,
  7440.                                             short depth,
  7441.                                             CompressorComponent compressor,
  7442.                                             CodecQ spatialQuality,
  7443.                                             CodecQ temporalQuality,
  7444.                                             long keyFrameRate);
  7445. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7446. depth    Specifies the depth at which the image is likely to be viewed. Image compressors may use this as an indication of the color or grayscale resolution of the compressed images. If you set this parameter to 0, the sequence grabber component determines the appropriate value for the source image. Values of 1, 2, 4, 8, 16, 24, and 32 indicate the number of bits per pixel for color images. Values of 33, 34, 36, and 40 indicate 1-bit, 2-bit, 4-bit, and 8-bit grayscale, respectively, for grayscale images. Your program can determine which depths are supported by a given compressor by examining the compressor information structure returned by the Image Compression Manager’s GetCodecInfo function (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information on the GetCodecInfo function).
  7447.     Set this parameter to 0 to leave the depth unchanged.
  7448. compressor
  7449. Specifies the image compressor identifier. Specify a particular compressor by setting this parameter to its compressor identifier. You can obtain this identifier from the Image Compression Manager’s GetCodecNameList function. Set this parameter to 0 to leave the compressor unchanged.
  7450. spatialQuality
  7451. Specifies the desired compressed image quality. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for valid values. 
  7452. temporalQuality
  7453. Specifies the desired sequence temporal quality. This parameter governs the level of compression you desire with respect to information between successive frames in the sequence. Set this parameter to 0 to prevent the image compressor from applying temporal compression to the sequence. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for other valid values.
  7454. keyFrameRate
  7455. Specifies the maximum number of frames allowed between key frames. Key frames provide points from which a temporally compressed sequence may be decompressed. Use this parameter to control the frequency at which the image compressor places key frames into the compressed sequence. For more information about key frames, see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime.
  7456.     The compressor determines the optimum placement for key frames based upon the amount of redundancy between adjacent images in the sequence. Consequently, the compressor may insert key frames more frequently than you have requested. However, the compressor will never place key frames less often than is indicated by the setting of the keyFrameRate parameter. The compressor ignores this parameter if you have not requested temporal compression (that is, you have set the temporalQuality parameter to 0). 
  7457. DESCRIPTION
  7458. Typically, you are interested in setting only one or two of these parameters. You can call the SGGetVideoCompressor function to retrieve the values of all of the parameters, and you can then use that information to supply values for the parameters you do not wish to change.
  7459. SPECIAL CONSIDERATIONS
  7460. You may call this function during a record operation or after you have prepared the sequence grabber component for a record operation only if you set the depth and compressor parameters to 0. This allows you to work with the quality or key frame rate configuration while you are capturing a sequence.
  7461. RESULT CODESparamErr    –50    Invalid parameter specified    
  7462. cantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7463. notEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  7464. deviceCantMeetRequest    –9408    Device cannot support grabber    
  7465.  
  7466. SGGetVideoCompressor
  7467.  
  7468. The SGGetVideoCompressor function allows you to determine a channel’s current image-compression parameters. 
  7469. pascal ComponentResult SGGetVideoCompressor (SGChannel c, 
  7470.                                         short *depth,
  7471.                                          compressorComponent *compressor,
  7472.                                          CodecQ *spatialQuality, 
  7473.                                         CodecQ *temporalQuality, 
  7474.                                         long *keyFrameRate);
  7475. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7476. depth    Contains a pointer to a field that is to receive the depth at which the image is likely to be viewed. Image compressors may use this as an indication of the color or grayscale resolution of the compressed images. If the value returned by this function is 0, the sequence grabber component determines the appropriate value for the source image. Values of 1, 2, 4, 8, 16, 24, and 32 indicate the number of bits per pixel for color images. Values of 33, 34, 36, and 40 indicate 1-bit, 2-bit, 4-bit, and 8-bit grayscale, respectively, for grayscale images. Your program can determine which depths are supported by a given compressor by examining the compressor information record (defined by the CodecInfo data type) returned by the Image Compression Manager’s GetCodecInfo function (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information on the GetCodecInfo function).
  7477.     If you are not interested in this information, set this parameter to nil.
  7478. compressor
  7479. Contains a pointer a field that is to receive an image compressor identifier. If you are not interested in this information, set this parameter to nil.
  7480. spatialQuality
  7481. Contains a pointer to a field that is to receive the desired compressed image quality. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for valid values. If you are not interested in this information, set this parameter to nil.
  7482. temporalQuality
  7483. Contains a pointer to a field that is to receive the desired sequence temporal quality. This parameter governs the level of compression you desire with respect to information between successive frames in the sequence. If the returned value is set to 0, the image compressor is not performing temporal compression on the source video. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for other valid values.
  7484.     If you are not interested in this information, set this parameter to nil.
  7485. keyFrameRate
  7486. Contains a pointer to a field that is to receive the maximum number of frames allowed between key frames. Key frames provide points from which a temporally compressed sequence may be decompressed. This value controls the frequency at which the image compressor places key frames into the compressed sequence. The compressor determines the optimum placement for key frames based upon the amount of redundancy between adjacent images in the sequence. Consequently, the compressor may insert key frames more frequently than you have requested. However, the compressor will never place key frames less often than is indicated by the setting of the keyFrameRate parameter. The compressor ignores this value if you have not requested temporal compression (that is, you have set the temporalQuality parameter of the SGSetVideoCompressor function to 0). 
  7487.     If you are not interested in this information, set this parameter to nil.
  7488. SEE ALSO
  7489. You can set these parameters by calling the SGSetVideoCompressor function, which is described in the previous section.
  7490. SGSetVideoDigitizerComponent
  7491.  
  7492. The SGSetVideoDigitizerComponent function allows you to assign a video digitizer component to a video channel. 
  7493. pascal ComponentResult SGSetVideoDigitizerComponent 
  7494.                                     (SGChannel c, ComponentInstance vdig);
  7495. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7496. vdig    Contains a component instance that identifies a connection to a video digitizer component. The specified video channel component uses this video digitizer component to obtain its source video data. For more information about video digitizer components, see the chapter “Video Digitizer Components” in this book.
  7497. DESCRIPTION
  7498. Typically, the video channel component locates its own video digitizer component. Consequently, you may not need to use the SGSetVideoDigitizerComponent function. 
  7499. SPECIAL CONSIDERATIONS
  7500. You cannot use the SGSetVideoDigitizerComponent function during a record operation. Many values are reinitialized as a result of changing digitizers.
  7501. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7502.  
  7503. SGGetVideoDigitizerComponent
  7504.  
  7505. The SGGetVideoDigitizerComponent function allows you to determine the video digitizer component that is providing source video to a video channel component. You can use this function to obtain access to the video digitizer component so that you can set its parameters, if you so desire. See the chapter “Video Digitizer Components” in this book for information about video digitizer components.
  7506. pascal ComponentInstance SGGetVideoDigitizerComponent 
  7507.                                                                     (SGChannel c);
  7508. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7509. DESCRIPTION
  7510. The SGGetVideoDigitizerComponent function returns a component instance that identifies the connection between the video channel component and its video digitizer component. If the video channel component does not use a video digitizer component, this returned value is set to nil.
  7511. SPECIAL CONSIDERATIONS
  7512. If you change any video digitizer component parameters, be sure to notify the sequence grabber component by calling the SGVideoDigitizerChanged function, which is described in the next section. In addition, you should not change any video digitizer component parameters during a record operation.
  7513. SGVideoDigitizerChanged
  7514.  
  7515. The SGVideoDigitizerChanged function allows you to notify the sequence grabber component whenever you change the configuration of a video channel’s video digitizer. 
  7516. pascal ComponentResult SGVideoDigitizerChanged (SGChannel c);
  7517. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7518. DESCRIPTION
  7519. The sequence grabber and its video channels maintain information about the configuration of any video digitizer components that are currently in use. 
  7520. IMPORTANT
  7521. IMPORTANT
  7522. It is very important to notify the sequence grabber of any configuration changes you make.s
  7523. SPECIAL CONSIDERATIONS
  7524. You should not change the configuration of the video digitizer during a record operation.
  7525. SEE ALSO
  7526. You can obtain access to a video channel’s video digitizer component by calling the SGGetVideoDigitizerComponent function, which is described in the previous section.
  7527. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7528.  
  7529. SGSetCompressBuffer
  7530.  
  7531. Some video source data may contain unacceptable levels of visual noise or artifacts. One technique for removing this noise is to capture the image and then reduce it in size. During the size reduction process, the noise can be filtered out. 
  7532. The SGSetCompressBuffer function creates a filter buffer for a video channel. Logically, this buffer sits between the source video buffer and the destination rectangle you set with the SGSetChannelBounds function, described on page 5-65. The filter buffer should be larger than the area enclosed by the destination rectangle.
  7533. pascal ComponentResult SGSetCompressBuffer (SGChannel c, 
  7534.                                                     short depth, 
  7535.                                                     const Rect *compressSize);
  7536. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7537. depth    Specifies the pixel depth of the filter buffer. If you set this parameter to 0, the sequence grabber component uses the depth of the video buffer.
  7538. compressSize
  7539. Contains a pointer to the dimensions of the filter buffer. This buffer should be larger than the destination buffer. Set this parameter to nil, or set the coordinates of this rectangle to 0 (specifying an empty rectangle), to stop filtering the input source video data.
  7540. DESCRIPTION
  7541. If you establish a filter buffer for a channel, the sequence grabber component places the captured video image into the filter buffer, then copies the image into the destination buffer. This process may be too slow for some record operations, but can be useful during controlled record operations (where the source video can be read on a frame-by-frame basis). Be sure to call this function before you prepare the sequence grabber component for the record or playback operation.
  7542. Figure 5-2 demonstrates the process by which the SGSetCompressBuffer function creates a filter buffer for a video channel. 
  7543. Figure 5-2    The effect of the SGSetCompressBuffer function
  7544.  
  7545. SEE ALSO
  7546. If you want to perform some more elaborate image filtering, you may define a transfer-frame function. See “Video Channel Callback Functions” beginning on page 5-99 for more information about transfer-frame functions.
  7547. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7548.  
  7549. SGGetCompressBuffer
  7550.  
  7551. The SGGetCompressBuffer function returns information about the filter buffer you have established for a video channel. 
  7552. pascal ComponentResult SGGetCompressBuffer (SGChannel c, 
  7553.                                                             short *depth, 
  7554.                                                             Rect *compressSize);
  7555. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7556. depth    Contains a pointer to a field that is to receive the pixel depth of the filter buffer. If the returned value is set to 0, the sequence grabber is not filtering the input video data.
  7557. compressSize
  7558. Contains a pointer to a rectangle structure that is to receive the dimensions of the filter buffer. If the sequence grabber is not filtering the input video data, it returns an empty rectangle (all coordinates set to 0).
  7559. SEE ALSO
  7560. You set a filter buffer by calling the SGSetCompressBuffer function, which is described in the previous section.
  7561. SGSetFrameRate
  7562.  
  7563. The SGSetFrameRate function allows you to specify a video channel’s frame rate for recording.
  7564. pascal ComponentResult SGSetFrameRate (SGChannel c, 
  7565.                                                      Fixed frameRate);
  7566. c    Identifies the channel for this operation. You provide your 
  7567. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function, discussed on page 5-31 and page 5-32, respectively.
  7568. frameRate    Specifies the desired frame rate. Set this parameter to 0 to select the channel’s default frame rate. Typically, this corresponds to the fastest rate that the channel can support.
  7569. DESCRIPTION
  7570. The SGSetFrameRate function allows you to control a video channel’s frame rate. Note that the digitizing hardware may not be able to support the full rate you specify. If you specify too high a rate, the sequence grabber operates at the highest rate that it can support. Note that you may not call this function when you are recording.
  7571. RESULT CODESparamErr    –50    Invalid parameter value    
  7572. cantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7573.  
  7574. SEE ALSO
  7575. You can retrieve a channel’s current frame rate by calling the SGGetFrameRate function, which is described next.
  7576. SGGetFrameRate
  7577.  
  7578. The SGGetFrameRate function allows you to retrieve a video channel’s frame rate for recording.
  7579. pascal ComponentResult SGGetFrameRate (SGChannel c, 
  7580.                                                     Fixed *frameRate);
  7581. c    Identifies the channel for this operation. You provide your 
  7582. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function, discussed on page 5-31 and page 5-32, respectively.
  7583. frameRate    Contains a pointer to a field to receive the current frame rate. The sequence grabber returns the channel’s current frame rate.
  7584. DESCRIPTION
  7585. The SGGetFrameRate function returns the channel’s current rate. By default, the channel records at the fastest rate it can support. In this case, the channel sets the field referred to by the frameRate parameter to 0.
  7586. SEE ALSO
  7587. You can set a channel’s frame rate by calling the SGSetFrameRate function, which is described in the previous section.
  7588. SGSetUseScreenBuffer
  7589.  
  7590. The SGSetUseScreenBuffer function allows you to control whether a video channel uses an offscreen buffer.
  7591. pascal ComponentResult SGSetUseScreenBuffer (SGChannel c, 
  7592.                                                     Boolean useScreenBuffer);
  7593. c    Identifies the channel for this operation. You provide your 
  7594. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function, discussed on page 5-31 and page 5-32, respectively.
  7595. useScreenBuffer    
  7596. Indicates whether to use an offscreen buffer. If you set this parameter to true, the channel draws directly to the screen. If you set it to false, the channel may use an offscreen buffer. If the channel cannot work with offscreen buffers, it ignores this parameter.
  7597. DESCRIPTION
  7598. By default, video channels try to draw directly to the screen. The SGSetUseScreenBuffer function allows you to direct a video channel to 
  7599. draw to an offscreen buffer. If the channel cannot draw offscreen, it ignores 
  7600. this function. Note that you may not call this function when you are recording.
  7601. Directing a channel to draw offscreen may be useful if you are performing transformations on the data before displaying it (such as blending it with another graphical image).
  7602. RESULT CODESparamErr    –50    Invalid parameter value    
  7603. cantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7604.  
  7605. SEE ALSO
  7606. You can determine whether you have allowed a channel to draw offscreen by calling the SGGetUseScreenBuffer function, which is described next.
  7607. SGGetUseScreenBuffer
  7608.  
  7609. The SGGetUseScreenBuffer function allows you to determine whether a video channel is allowed to use an offscreen buffer.
  7610. pascal ComponentResult SGGetUseScreenBuffer (SGChannel c, 
  7611.                                                     Boolean *useScreenBuffer);
  7612. c    Identifies the channel for this operation. You provide your 
  7613. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function, discussed on page 5-31 and page 5-32, respectively.
  7614. useScreenBuffer
  7615. Contains a pointer to a Boolean value. The sequence grabber sets this field to reflect whether you have allowed the channel to draw offscreen. If this field is set to true, the channel draws directly to the screen. If it is set to false, the channel may use an offscreen buffer. If the channel cannot work with offscreen buffers, it ignores this value.
  7616. DESCRIPTION
  7617. By default, video channels draw directly to the screen. You can direct a channel to draw to an offscreen buffer by calling the SGSetUseScreenBuffer function. Channels that can work offscreen then allocate and draw to an offscreen buffer. 
  7618. SEE ALSO
  7619. You can allow a channel to draw offscreen by calling the SGSetUseScreenBuffer function, which is described in the previous section.
  7620. Working With Sound Channels
  7621.  
  7622. Sequence grabber components provide a number of functions that allow you to configure the grabber’s sound channels. This section describes these configuration functions, which you can use only with sound channels. You can determine whether a channel has a sound representation by calling the SGGetChannelInfo function, described on page 5-61. If you want to configure a video channel, use the 
  7623. functions described in “Working With Video Channels” beginning on page 5-77. If you want to configure general attributes of a channel, use the functions described in “Working With Channel Characteristics” beginning on page 5-58.
  7624. Use the SGSetSoundInputDriver function to specify a channel’s sound 
  7625. input device. You can determine a channel’s sound input device by calling the SGGetSoundInputDriver function. If you change any attributes of the sound input device, you should notify the sequence grabber component by calling the SGSoundInputDriverChanged function. By default, the sequence grabber component uses the sound driver’s best settings.
  7626. You can control the amount of sound data the sequence grabber works with at one 
  7627. time by calling the SGSetSoundRecordChunkSize function. You can determine 
  7628. this value by calling the SGGetSoundRecordChunkSize function.
  7629. You can control the rate at which the sound channel samples the input data by calling the SGSetSoundInputRate function. You can determine the sample rate by calling the SGGetSoundInputRate function.
  7630. You can control other sound input parameters by using the SGSetSoundInputParameters and SGGetSoundInputParameters functions.
  7631. SGSetSoundInputDriver
  7632.  
  7633. Some sound channel components may use sound input devices to obtain their source data. The SGSetSoundInputDriver function allows you to assign a sound input device to a sound channel.
  7634. pascal ComponentResult SGSetSoundInputDriver (SGChannel c, 
  7635.                                                     const Str255 driverName);
  7636. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7637. driverName
  7638. Specifies the name of the sound input device. This is a Pascal string, and it must correspond to a valid sound input device.
  7639. DESCRIPTION
  7640. If the sound channel component does not use sound input devices, it returns a nonzero result code. For more information about sound input devices, see Inside Macintosh: More Macintosh Toolbox—in particular, refer to the discussion of the Sound Manager’s SPBGetIndexedDevice routine.
  7641. SPECIAL CONSIDERATIONS
  7642. You cannot call the SGSetSoundInputDriver function during a record operation.
  7643. RESULT CODESnoDeviceForChannel     –9400    Channel component cannot find its device    
  7644. cantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7645. deviceCantMeetRequest    –9408    Device cannot support grabber    
  7646.  
  7647. SGGetSoundInputDriver
  7648.  
  7649. The SGGetSoundInputDriver function allows you to determine the sound input device currently in use by a sound channel component. 
  7650. pascal long SGGetSoundInputDriver (SGChannel c);
  7651. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7652. DESCRIPTION
  7653. The SGGetSoundInputDriver function returns a reference to the sound input device. If the sound channel is not using a sound input device, this returned value is set to nil.
  7654. You may want to gain access to the sound input device if you want to change the device’s configuration. 
  7655. SPECIAL CONSIDERATIONS
  7656. If you change any of the device’s operating parameters, be sure to inform the sequence grabber component by calling the SGSoundInputDriverChanged function, which is described in the next section.
  7657. SEE ALSO
  7658. You can assign a sound input device to a sound channel by calling the SGSetSoundInputDriver function, described in the previous section.
  7659. SGSoundInputDriverChanged
  7660.  
  7661. The SGSoundInputDriverChanged function allows you to notify the sequence grabber component whenever you change the configuration of a sound channel’s sound input device. 
  7662. pascal ComponentResult SGSoundInputDriverChanged (SGChannel c);
  7663. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7664. DESCRIPTION
  7665. The sequence grabber’s sound channels maintain information about the configuration of any sound input devices that are currently in use. It is very important to notify the sequence grabber component of any configuration changes you make.
  7666. SPECIAL CONSIDERATIONS
  7667. You should not change the configuration of the sound input device during a record operation.
  7668. SEE ALSO
  7669. You can obtain access to a sound channel’s sound input device by calling the SGGetSoundInputDriver function, which is described in the previous section.
  7670. SGSetSoundRecordChunkSize
  7671.  
  7672. During record operations, the sequence grabber works with groups of sound samples. These groups are referred to as chunks. By default, each chunk contains two seconds of sound data. Smaller chunks use less memory. You can control the amount of sound data in each chunk by calling the SGSetSoundRecordChunkSize function. 
  7673. pascal ComponentResult SGSetSoundRecordChunkSize (SGChannel c,
  7674.                                                                     long seconds);
  7675. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7676. seconds    Specifies the number of seconds of sound data the sequence grabber is to work with at a time. To specify a fraction of a second, set this parameter to a negative fixed-point number. For example, to set the duration to half a second, pass in –0.5 in this parameter.
  7677. DESCRIPTION
  7678. You specify the number of seconds of sound data the sequence grabber is to work with at a time.
  7679. SPECIAL CONSIDERATIONS
  7680. You cannot call the SGSetSoundRecordChunkSize function during a record or preview operation, or after you have prepared the sequence grabber for a record 
  7681. or preview operation (by calling the SGPrepare function, described on page 5-43).
  7682. This function may return a fraction (for details, see the discussion of the seconds parameter above).
  7683. RESULT CODESparamErr    –50    Invalid parameter specified    
  7684. cantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7685.  
  7686. SGGetSoundRecordChunkSize
  7687.  
  7688. The SGGetSoundRecordChunkSize function allows you to determine the amount of sound data the sequence grabber component works with at a time.
  7689. pascal long SGGetSoundRecordChunkSize (SGChannel c);
  7690. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7691. DESCRIPTION
  7692. SGGetSoundRecordChunkSize returns a long integer that specifies the number of seconds of sound data the sequence grabber works with at a time.
  7693. SEE ALSO
  7694. You set the amount of sound data the sequence grabber component works with at any given time by calling the SGSetSoundRecordChunkSize function, which is described in the previous section.
  7695. SGSetSoundInputRate
  7696.  
  7697. The SGSetSoundInputRate function allows you to set the rate at which the sound channel obtains its sound data.
  7698. pascal ComponentResult SGSetSoundInputRate (SGChannel c,
  7699.                                                             Fixed rate);
  7700. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7701. rate    Specifies the rate at which the sound channel is to acquire data. This parameter specifies the number of samples the sound channel is to generate per second. If the sound channel cannot support the rate you specify, it uses the closest available rate that it supports—you can use the SGGetSoundInputRate function, described in the next section, to retrieve the rate being used by the channel. Set this parameter to 0 to cause the sound channel to use its default rate.
  7702.     You can determine the rates that are valid for a sound channel that uses a sound input device by calling the Sound Manager (see Inside Macintosh: More Macintosh Toolbox for more information about the Sound Manager). 
  7703. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7704. deviceCantMeetRequest    –9408    Device cannot support grabber    
  7705.  
  7706. SGGetSoundInputRate
  7707.  
  7708. The SGGetSoundInputRate function allows you to determine the rate at which the sound channel is collecting sound data. 
  7709. pascal Fixed SGGetSoundInputRate (SGChannel c);
  7710. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7711. DESCRIPTION
  7712. SGGetSoundInputRate returns a fixed-point number that indicates the number of samples the sound channel collects per second.
  7713. SEE ALSO
  7714. You set the rate at which the sound channel is collecting data by calling the SGSetSoundInputRate function, which is described in the previous section.
  7715. SGSetSoundInputParameters
  7716.  
  7717. The SGSetSoundInputParameters function allows you to set some parameters that relate to sound recording.
  7718. pascal ComponentResult SGSetSoundInputParameters (SGChannel c,                         
  7719.                                                         short sampleSize,
  7720.                                                         short numChannels,
  7721.                                                         OSType compressionType);
  7722. c    Identifies the channel for this operation. You provide your 
  7723. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function, discussed on page 5-31 and page 5-32, respectively.
  7724. sampleSize    
  7725. Specifies the number of bits in each sound sample. Set this field to 8 for 8-bit sound; set it to 16 for 16-bit sound.
  7726. numChannels    
  7727. Indicates the number of sound channels used by the sound sample. Set this field to 1 for monaural sounds; set it to 2 for stereo sounds.
  7728. compressionType    
  7729. Describes the format of the sound data. The following values are supported:
  7730. 'raw '    Sound samples are uncompressed, in offset-binary format (that is, sample data values range from 0 to 255).
  7731. 'MAC3'    Sound samples have been compressed by the Sound Manager at a ratio of 3:1.
  7732. 'MAC6'    Sound samples have been compressed by the Sound Manager at a ratio of 6:1.
  7733. DESCRIPTION
  7734. You may use the SGSetSoundInputParameters function to control many parameters relating to sound recording. All of the sound parameters support two special values. If you set any of these parameters to 0, the sequence grabber does not change the current value of that parameter. If you set any of them to –1, the sequence grabber returns that parameter to its default value. 
  7735. If you select a parameter value that the sound device cannot support, the sequence grabber returns an appropriate Sound Manager result code.
  7736. RESULT CODES
  7737. Sound Manager errors
  7738. SGGetSoundInputParameters
  7739.  
  7740. The SGGetSoundInputParameters function allows you to retrieve some parameters that relate to sound recording.
  7741. pascal ComponentResult SGGetSoundInputParameters (SGChannel c,
  7742.                                                      short *sampleSize,
  7743.                                                      short *numChannels,
  7744.                                                      OSType *compressionType);
  7745. c    Identifies the channel for this operation. You provide your 
  7746. connection identifier. You connect to a channel component by calling the SGNewChannel or SGNewChannelFromComponent function, discussed on page 5-31 and page 5-32, respectively.
  7747. sampleSize
  7748. Contains a pointer to a field to receive the sample size. The sequence grabber sets this field to 8 for 8-bit sound; it sets the field to 16 for 16-bit sound.
  7749. numChannels    
  7750. Contains a pointer to a field to receive the number of sound channels used by the sound sample. The sequence grabber sets this field to 1 for monaural sounds; it sets the field to 2 for stereo sounds.
  7751. compressionType    
  7752. Contains a pointer to a field that is to receive the format of the sound data. The following values may be returned:
  7753. 'raw'    Sound samples are uncompressed, in offset-binary format (that is, sample data values range from 0 to 255).
  7754. 'MAC3'    Sound samples have been compressed by the Sound Manager at a ratio of 3:1.
  7755. 'MAC6'    Sound samples have been compressed by the Sound Manager at a ratio of 6:1.
  7756. DESCRIPTION
  7757. You may use the SGGetSoundInputParameters function to retrieve many parameters relating to sound recording. If you set any of the sound parameters to nil, the sequence grabber does not return that value. 
  7758. Video Channel Callback Functions
  7759.  
  7760. Sequence grabber components allow you to define a number of callback functions in your application. The sequence grabber calls your functions at specific points in the process of collecting, compressing, and displaying the source video data. By defining callback functions, you can control the process more precisely or customize the operation of the sequence grabber component.
  7761. For example, you could use a callback function to draw a frame number on each video frame as it is collected. You could use either a compress callback function or a grab-complete callback function to accomplish this. The compress callback function 
  7762. is called after each frame is collected, in order to compress the frame. The grab-complete callback function is called just before the compress callback function, as soon as the frame has been captured.
  7763. The SGSetVideoBottlenecks function lets you assign callback functions to a video channel. You can use the SGGetVideoBottlenecks function to determine the callback functions that have been assigned to a video channel.
  7764. The SGSetVideoBottlenecks function accepts a video bottlenecks structure that identifies the callback functions to be assigned to the channel. In addition, the SGGetVideoBottlenecks function contains a pointer to this structure.
  7765. The video bottlenecks structure is defined by the VideoBottles data type as follows:
  7766. struct VideoBottles {
  7767.     short                                     procCount;                        /* count of callbacks */
  7768.     GrabProc                                     grabProc;                        /* grab function */
  7769.     GrabCompleteProc                                     grabCompleteProc;                        /* grab-complete function */
  7770.     DisplayProc                                     displayProc;                        /* display function */
  7771.     CompressProc                                     compressProc;                        /* compress function */
  7772.     CompressCompleteProc                                     compressCompleteProc;
  7773.                                                                 /* compress-complete
  7774.                                                                     function */
  7775.     AddFrameProc                                     addFrameProc;                        /* add-frame function */
  7776.     TransferFrameProc                                     transferFrameProc;                        /* transfer-frame function */
  7777.     GrabCompressCompleteProc                                    grabCompressCompleteProc;
  7778.                                                                 /* grab-compress–complete
  7779.                                                                     function */
  7780.     DisplayCompressProc                                    displayCompressProc;
  7781.                                                                 /* display-compress
  7782.                                                                     function */
  7783. };
  7784. typedef struct VideoBottles VideoBottles;
  7785. Field descriptions
  7786. procCount    Specifies the number of callback functions that may be identified in the structure. Set this field to 9.
  7787. grabProc    Identifies the grab function. If you are setting a grab function, set this field so that it points to the function’s entry point. If you are not setting a grab function, set this field to nil.
  7788. grabCompleteProc
  7789. Identifies the grab-complete function. If you are setting a grab-complete function, set this field so that it points to 
  7790. the function’s entry point. If you are not setting a grab-complete function, set this field to nil.
  7791. displayProc    Identifies the display function. If you are setting a display function, set this field so that it points to the function’s entry point. If you are not setting a display function, set this field to nil.
  7792. compressProc    Identifies the compress function. If you are setting a compress function, set this field so that it points to the function’s entry point. If you are not setting a compress function, set this field to nil.
  7793. compressCompleteProc
  7794. Identifies the compress-complete function. If you are setting a compress-complete function, set this field so that it points to 
  7795. the function’s entry point. If you are not setting a compress-complete function, set this field to nil.
  7796. addFrameProc    Identifies the add-frame function. If you are setting an add-frame function, set this field so that it points to the function’s entry point. If you are not setting an add-frame function, set this field to nil.
  7797. transferFrameProc
  7798. Identifies the transfer-frame function. If you are setting a transfer-frame function, set this field so that it points to 
  7799. the function’s entry point. If you are not setting a transfer-frame function, set this field to nil.
  7800. grabCompressCompleteProc
  7801. Identifies the grab-compress–complete function. If you are setting a grab-compress–complete function, set this field so that it points to the function’s entry point. If you are not setting a grab-compress–complete function, set this field to nil.
  7802. displayCompressProc
  7803. Identifies the display-compress function. If you are setting a display-compress function, set this field so that it points to 
  7804. the function’s entry point. If you are not setting a display-compress function, set this field to nil.
  7805. SGSetVideoBottlenecks
  7806.  
  7807. The SGSetVideoBottlenecks function assigns callback functions to a video channel. 
  7808. pascal ComponentResult SGSetVideoBottlenecks (SGChannel c,
  7809.                                                              VideoBottles *vb);
  7810. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7811. vb    Contains a pointer to a video bottlenecks structure (defined by the VideoBottles data type). That structure identifies the callback functions to be assigned to this video channel. The video bottlenecks structure is described on page 5-100.
  7812. DESCRIPTION
  7813. The SGSetVideoBottlenecks function accepts a video bottlenecks structure that identifies the callback functions to be assigned to the channel.
  7814. SPECIAL CONSIDERATIONS
  7815. Your application should not call this function during a record or playback operation.
  7816. SGGetVideoBottlenecks
  7817.  
  7818. The SGGetVideoBottlenecks function allows you to determine the callback functions that have been assigned to a video channel.
  7819. pascal ComponentResult SGGetVideoBottlenecks (SGChannel c,
  7820.                                                              VideoBottles *vb);
  7821. c    Specifies the reference that identifies the channel for this operation. You obtain this reference from the SGNewChannel function, described on page 5-31.
  7822. vb    Contains a pointer to a video bottlenecks structure, described on page 5-100. The SGGetVideoBottlenecks function sets the fields of that structure to indicate the callback functions that have been assigned to this video channel. You must set the procCount field in the video bottlenecks structure to 9.
  7823. SEE ALSO
  7824. You assign callback functions to a video channel by calling the SGSetVideoBottlenecks function, which is described in the previous section.
  7825. Utility Functions for Video Channel Callback Functions
  7826.  
  7827. Sequence grabber components provide a number of functions that your callback functions can use. This section describes those functions.
  7828. Use the SGGetBufferInfo function to obtain information about a buffer that contains data to be manipulated by your callback function.
  7829. The remaining functions described here provide default behavior for your callback functions.
  7830. SGGetBufferInfo
  7831.  
  7832. You can use the SGGetBufferInfo function to obtain information about a buffer that has been passed to your callback function.
  7833. pascal ComponentResult SGGetBufferInfo (SGChannel c, 
  7834.                                                     short bufferNum,
  7835.                                                     PixMapHandle *bufferPM,
  7836.                                                     Rect *bufferRect, 
  7837.                                                     GWorldPtr *compressBuffer,
  7838.                                                     Rect *compressBufferRect);
  7839. c    Specifies the reference that identifies the channel for this operation. 
  7840. bufferNum    Identifies the buffer. The sequence grabber component provides this value to your callback function.
  7841. bufferPM    Contains a pointer to a location that is to receive a handle to the pixel map that contains the image. Note that this pixel map may be offscreen. Do not dispose of this pixel map. If you do not want this information, set this parameter to nil.
  7842. bufferRect
  7843. Contains a pointer to a rectangle structure that is to receive the dimensions of the image’s boundary rectangle. If you do not want this information, set this parameter to nil.
  7844. compressBuffer
  7845. Contains a pointer to a location that is to receive a pointer to the filter buffer for the image. The sequence grabber component returns this information only if your application has assigned a filter buffer to this video channel. You assign a filter buffer by calling the SGSetCompressBuffer function, which is described on page 5-87. Do not dispose of this buffer. 
  7846.     If you have not assigned a filter buffer, the sequence grabber sets the returned value to nil. If you do not want this information, set this parameter to nil.
  7847. compressBufferRect
  7848. Contains a pointer to a rectangle structure that is to receive the dimensions of the filter buffer for the image. The sequence grabber component returns this information only if your application has assigned a filter buffer to this video channel. You assign a filter buffer by calling the SGSetCompressBuffer function, which is described on page 5-87. If you have not assigned a filter buffer, the sequence grabber component returns an empty rectangle. If you do not want this information, set this parameter to nil.
  7849. RESULT CODEparamErr    –50    Invalid parameter specified    
  7850.  
  7851. SGGrabFrame
  7852.  
  7853. The SGGrabFrame function provides the default behavior for your grab function. 
  7854. pascal ComponentResult SGGrabFrame (SGChannel c, short bufferNum);
  7855. c    Specifies the reference that identifies the channel for this operation. The sequence grabber component provides this value to your grab function.
  7856. bufferNum    Identifies the buffer. The sequence grabber component provides this value to your grab function.
  7857. SPECIAL CONSIDERATIONS
  7858. You should call the SGGrabFrame function only from your grab function. If you call it at any other time, results are unpredictable.
  7859. SEE ALSO
  7860.  See “Application-Defined Functions,” which begins on page 5-111, for information about grab-complete functions.
  7861. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7862.  
  7863. SGGrabFrameComplete
  7864.  
  7865. The SGGrabFrameComplete function provides the default behavior for your grab-complete function.
  7866. pascal ComponentResult SGGrabFrameComplete (SGChannel c, 
  7867.                                                             short bufferNum,
  7868.                                                             Boolean *done);
  7869. c    Specifies the reference that identifies the channel for this operation. The sequence grabber provides this value to your grab-complete function.
  7870. bufferNum    Identifies the buffer. The sequence grabber provides this value to your grab-complete function.
  7871. done    Contains a pointer to a Boolean value. The SGGrabFrameComplete function sets this Boolean value to indicate whether the frame has been completely captured. The function sets the Boolean value to true if the capture is complete, and sets it to false if the capture is incomplete. The sequence grabber provides this pointer to your grab-complete function.
  7872. SPECIAL CONSIDERATIONS
  7873. You should call the SGGrabFrameComplete function only from your grab-complete function. If you call it at any other time, results are unpredictable.
  7874. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7875.  
  7876. SEE ALSO
  7877. See “Application-Defined Functions,” which begins on page 5-111, for details about grab-complete functions.
  7878. SGDisplayFrame
  7879.  
  7880. The SGDisplayFrame function provides the default behavior for your display function.
  7881. pascal ComponentResult SGDisplayFrame (SGChannel c, 
  7882.                                                     short bufferNum,
  7883.                                                     MatrixRecord *mp, 
  7884.                                                     RgnHandle clipRgn);
  7885. c    Specifies the reference that identifies the channel for this operation. The sequence grabber component provides this value to your display function.
  7886. bufferNum    Identifies the buffer. The sequence grabber component provides this value to your display function.
  7887. mp    Contains a pointer to a transformation matrix for the display operation. If there is no matrix for the operation, set this parameter to nil.
  7888. clipRgn    Contains a handle to the clipping region for the destination image. This region is defined in the destination coordinate system. If there is no clipping region, set this parameter to nil.
  7889. SPECIAL CONSIDERATIONS
  7890. You should call the SGDisplayFramefunction only from your display function. 
  7891. If you call it at any other time, results are unpredictable.
  7892. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7893.  
  7894. SEE ALSO
  7895. See “Application-Defined Functions,” which begins on page 5-111, for details about display functions.
  7896. SGCompressFrame
  7897.  
  7898. The SGCompressFrame function provides the default behavior for your compress function.
  7899. pascal ComponentResult SGCompressFrame (SGChannel c, 
  7900.                                                     short bufferNum);
  7901. c    Specifies the reference that identifies the channel for this operation. The sequence grabber provides this value to your compress function.
  7902. bufferNum    Identifies the buffer. The sequence grabber provides this value to your compress function.
  7903. SPECIAL CONSIDERATIONS
  7904. You should call the SGCompressFrame function only from your compress function. 
  7905. If you call it at any other time, results are unpredictable.
  7906. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7907.  
  7908. Image Compression Manager errors
  7909. SEE ALSO
  7910. See “Application-Defined Functions,” which begins on page 5-111, for information about compress functions.
  7911. SGCompressFrameComplete
  7912.  
  7913. The SGCompressFrameComplete function provides the default behavior for your compress-complete function.
  7914. pascal ComponentResult SGCompressFrameComplete (SGChannel c, 
  7915.                                                             short bufferNum,
  7916.                                                             Boolean *done,
  7917.                                                             SGCompressInfo *ci);
  7918. c    Specifies the reference that identifies the channel for this operation. 
  7919. The sequence grabber component provides this value to your compress-complete function.
  7920. bufferNum    Identifies the buffer. The sequence grabber component provides this value to your compress-complete function.
  7921. done    Contains a pointer to a Boolean value. The SGCompressFrameComplete function sets this Boolean 
  7922. value to indicate whether the frame has been completely
  7923. compressed. The function sets the Boolean value to true 
  7924. if the compression is complete; it sets the Boolean value to 
  7925. false if the operation is incomplete. The sequence grabber 
  7926. component provides this pointer to your compress-complete function.
  7927. ci    Contains a pointer to a compression information structure (defined by the SGCompressInfo data type). If the compression is complete, the function completely formats this structure with information that is appropriate to the frame just compressed. See “The Compression Information Structure” beginning on page 5-22 for a description of this structure. The sequence grabber component provides this pointer to your compress-complete function.
  7928. SPECIAL CONSIDERATIONS
  7929. You should call the SGCompressFrameComplete function only from your compress-complete function. If you call it at any other time, results are unpredictable.
  7930. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7931.  
  7932. Image Compression Manager errors
  7933. SEE ALSO
  7934. See “Application-Defined Functions,” which begins on page 5-111, for information about compress-complete functions. 
  7935. SGAddFrame
  7936.  
  7937. The SGAddFrame function provides the default behavior for your add-frame function.
  7938. pascal ComponentResult SGAddFrame (SGChannel c, short bufferNum,
  7939.                                                  TimeValue atTime, 
  7940.                                                 TimeScale scale, 
  7941.                                                 const SGCompressInfo *ci);
  7942. c    Specifies the reference that identifies the channel for this operation. The sequence grabber component provides this value to your add-frame function.
  7943. bufferNum    Identifies the buffer. The sequence grabber component provides this value to your add-frame function.
  7944. atTime    Specifies the time at which the frame was captured, in the time 
  7945. scale specified by the scale parameter. The sequence grabber component provides this value to your add-frame function. Your add-frame function can change this value before calling the SGAddFrame function. You can determine the duration of a frame by subtracting its capture time from the capture time of the next frame in the sequence.
  7946. scale    Specifies the time scale of the movie. The sequence grabber component provides this value to your add-frame function.
  7947. ci    Contains a pointer to a compression information structure (defined by the SGCompressInfo data type). This structure contains information describing the compression characteristics of the image to be added to the movie. See “The Compression Information Structure” beginning on page 5-22 for a description of this structure. The sequence grabber component provides this structure to your add-frame function.
  7948. SPECIAL CONSIDERATIONS
  7949. You should call the SGAddFrame function only from your add-frame function. If you call it at any other time, results are unpredictable.
  7950. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7951.  
  7952. Memory Manager errors
  7953. SEE ALSO
  7954. See “Application-Defined Functions,” which begins on page 5-111, for information about add-frame functions. 
  7955. SGTransferFrameForCompress
  7956.  
  7957. The SGTransferFrameForCompress function provides the default behavior for your transfer-frame function.
  7958. pascal ComponentResult SGTransferFrameForCompress (SGChannel c,
  7959.                                                             short bufferNum,
  7960.                                                             MatrixRecord *mp,
  7961.                                                             RgnHandle clipRgn);
  7962. c    Specifies the reference that identifies the channel for this operation. The sequence grabber component provides this value to your transfer-frame function.
  7963. bufferNum    Identifies the buffer. The sequence grabber component provides this value to your transfer-frame function.
  7964. mp    Contains a pointer to a transformation matrix for the transfer operation. If there is no matrix for the operation, set this parameter to nil.
  7965. clipRgn    Contains a handle to the clipping region for the destination image. This region is defined in the destination coordinate system. If there is no clipping region, set this parameter to nil.
  7966. SPECIAL CONSIDERATIONS
  7967. You should call the SGTransferFrameForCompress function only from your transfer-frame function. If you call it at any other time, results are unpredictable.
  7968. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7969.  
  7970. SEE ALSO
  7971. See “Application-Defined Functions,” which begins on page 5-111, for information about transfer-frame functions. 
  7972. SGGrabCompressComplete
  7973.  
  7974. The SGGrabCompressComplete function provides the default behavior for your grab-compress–complete function.
  7975. pascal ComponentResult SGGrabCompressComplete (SGChannel c,     
  7976.                                                             Boolean *done,             
  7977.                                                             SGCompressInfo *ci,                 
  7978.                                                             TimeRecord *tr);
  7979. c    Identifies the channel for this operation. The sequence grabber provides this value to your grab-compress–complete function.
  7980. done    Contains a pointer to a Boolean value. The SGGrabCompressComplete function sets this value to true when it is done; it sets it to false if the operation is incomplete. The sequence grabber provides this pointer to your grab-compress–complete function.
  7981. ci    Contains a pointer to a compression information structure. When the operation is complete, the SGGrabCompressComplete function fills in this structure with information about the compression operation. The format and content of this structure are discussed earlier in this chapter, beginning on page 5-22.
  7982.     The sequence grabber provides this pointer to your grab-compress–complete function.
  7983. tr    Contains a pointer to a time record. When the operation is complete, the SGGrabCompressComplete function uses this structure to indicate when the frame was grabbed. The format and content of this structure are discussed in the chapter “Movie Toolbox” in Inside Macintosh: QuickTime.
  7984.     The sequence grabber provides this pointer to your grab-compress–complete function.
  7985. SPECIAL CONSIDERATIONS
  7986. You should call the SGGrabCompressComplete function only from your grab-compress–complete function. If you call it at other times, results are unpredictable.
  7987. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  7988.  
  7989. SEE ALSO
  7990. See “Application-Defined Functions” beginning on page 5-111 for information about grab-compress–complete functions.
  7991. SGDisplayCompress
  7992.  
  7993. The SGDisplayCompress function provides the default behavior for your display-compress function.
  7994. pascal ComponentResult SGDisplayCompress (SGChannel c, 
  7995.                                                 Ptr dataPtr, 
  7996.                                                 ImageDescriptionHandle desc, 
  7997.                                                  MatrixRecord *mp, 
  7998.                                                 RgnHandle clipRgn);
  7999. c    Identifies the channel for this operation. The sequence grabber provides this value to your display-compress function.
  8000. dataPtr    Contains a pointer to the compressed image data. The sequence grabber provides this pointer to your display-compress function.
  8001. desc    Specifies a handle to the image description structure to use for the decompression operation. The sequence grabber provides this handle to your display-compress function.
  8002. mp    Contains a pointer to a matrix structure. This matrix structure contains the transformation matrix to use when displaying the image. If there is no matrix for the operation, set this parameter to nil.
  8003. clipRgn    Contains a handle to the clipping region for the destination image. This region is defined in the destination coordinate system. If there is no clipping region, set this parameter to nil.
  8004. SPECIAL CONSIDERATIONS
  8005. You should call the SGDisplayCompress function only from your display-compress function. If you call it at other times, results are unpredictable.
  8006. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  8007.  
  8008. SEE ALSO
  8009. See the next section, “Application-Defined Functions,” for information about display-compress functions.
  8010. Application-Defined Functions
  8011.  
  8012. This section describes the functions that your application may supply to sequence grabber components. 
  8013. Your grab function is used by the sequence grabber component to begin the capture of a frame of video data. Your grab-complete function allows the sequence grabber component to determine whether the current frame-capture operation is complete. 
  8014. Your display function enables the sequence grabber component to move a captured video image in an offscreen buffer into the destination buffer for the video channel. 
  8015. The sequence grabber component uses your compress function to commence the compression of a captured video image. Your compress-complete function helps the sequence grabber component to find out if the current frame-compression operation is finished. 
  8016. Your add-frame function lets the sequence grabber component add a frame to a movie. 
  8017. The sequence grabber component uses your transfer-frame function to move a video frame from the capture buffer into the channel’s filter buffer.
  8018. You may provide two functions for use with compressed-source devices. Your grab-compress–complete function determines when the current capture and compress operation is complete. Your display-compress function decompresses and displays a frame.
  8019. The sequence grabber calls your data function whenever any of the grabber’s channels write data to the movie file.
  8020. If you call the SGSettingsDialog function, described on page 5-48, you must supply a modal-dialog filter function. The interface that your function must provide is discussed on page 5-122.
  8021. MyGrabFunction
  8022.  
  8023. The sequence grabber component calls your grab function in order to start capturing a frame of video data. 
  8024. Your grab function must present the following interface:
  8025. pascal ComponentResult MyGrabFunction (SGChannel c, 
  8026.                                                     short bufferNum, 
  8027.                                                     long refCon);
  8028. c    Specifies the reference that identifies the channel for this operation. 
  8029. bufferNum    Identifies the buffer for this operation. You can obtain information about this buffer by calling the SGGetBufferInfo function, which is described on page 5-102.
  8030. refCon    Contains a reference constant value. You can set this value by calling the SGSetChannelRefCon function, which is described on page 5-67.
  8031. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  8032.  
  8033. SEE ALSO
  8034. Your grab function can use the sequence grabber component’s SGGrabFrame function to support the default behavior. SGGrabFrame is described on page 5-103.
  8035. MyGrabCompleteFunction
  8036.  
  8037. The sequence grabber component calls your grab-complete function in order to determine whether the current frame-capture operation is complete. Once a frame has been completely captured, you can modify its contents to suit your needs. For example, you can overlay text onto the video image.
  8038. Your function must present the following interface:
  8039. pascal ComponentResult MyGrabCompleteFunction (SGChannel c,
  8040.                                                                  short bufferNum,
  8041.                                                                 Boolean *done,
  8042.                                                                  long refCon);
  8043. c    Specifies the reference that identifies the channel for this operation. 
  8044. bufferNum    Identifies the buffer for this operation. You can obtain information about this buffer by calling the SGGetBufferInfo function, which is described on page 5-102.
  8045. done    Contains a pointer to a Boolean value. Your function sets this Boolean value to indicate whether the frame has been completely captured. Set the Boolean value to true if the capture is complete; set it to false if it is incomplete.
  8046. refCon        Contains a reference constant value. You can set this value by calling the SGSetChannelRefCon function, which is described on page 5-67.
  8047. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  8048.  
  8049. SEE ALSO
  8050. Your grab-complete function can use the sequence grabber 
  8051. component’s SGGrabFrameComplete function to support the 
  8052. default behavior. SGGrabFrameComplete is described on page 5-104.
  8053. See Listing 5-6 on page 5-20 for a sample grab-complete function. This function draws the letters “QT” over each video frame in the sequence.
  8054. MyDisplayFunction
  8055.  
  8056. The sequence grabber component calls your display function in order to transfer a captured video image in an offscreen buffer into the destination buffer for the video channel.
  8057. Your display function must support the following interface:
  8058. pascal ComponentResult MyDisplayFunction (SGChannel c, 
  8059.                                                          short bufferNum, 
  8060.                                                          MatrixRecord *mp,
  8061.                                                          RgnHandle clipRgn,
  8062.                                                          long refCon);
  8063. c    Specifies the reference that identifies the channel for this operation. 
  8064. bufferNum    Identifies the buffer for this operation. You can obtain information about this buffer by calling the SGGetBufferInfo function, which is described on page 5-102.
  8065. mp    Contains a pointer to a transformation matrix for the display operation. If there is no matrix for the operation, this parameter is set to nil.
  8066. clipRgn    Contains a handle to the clipping region for the destination image. 
  8067. This region is defined in the destination coordinate system. Apply 
  8068. the clipping region after applying the transformation matrix. If there is no clipping region, this parameter is set to nil.
  8069. refCon    Contains a reference constant value. You can set this value by calling the SGSetChannelRefCon function, which is described on page 5-67.
  8070. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  8071.  
  8072. SEE ALSO
  8073. Your application sets the destination buffer by calling the SGSetChannelBounds function, which is described on page 5-65.
  8074. Your display function can use the sequence grabber component’s SGDisplayFrame function to support the default behavior. SGDisplayFrame is described on page 5-105.
  8075. MyCompressFunction
  8076.  
  8077. The sequence grabber component calls your compress function in order to start compressing the captured video image.
  8078. Your compress function must support the following interface:
  8079. pascal ComponentResult MyCompressFunction (SGChannel c, 
  8080.                                                          short bufferNum, 
  8081.                                                          long refCon);
  8082. c    Specifies the reference that identifies the channel for this operation. 
  8083. bufferNum    Identifies the buffer for this operation. You can obtain information about this buffer by calling the SGGetBufferInfo function, which is described on page 5-102.
  8084. refCon    Contains a reference constant value. You can set this value by calling the SGSetChannelRefCon function, which is described on page 5-67.
  8085. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  8086.  
  8087. Image Compression Manager errors
  8088. SEE ALSO
  8089. Your compress function can use the sequence grabber component’s SGCompressFrame function to support the default behavior. SGCompressFrame is described on page 5-105. This function uses the Image Compression Manager to compress the video image. For more on the Image Compression Manager, see Inside Macintosh: QuickTime.
  8090. MyCompressCompleteFunction
  8091.  
  8092. The sequence grabber component calls your compress-complete function in order to determine whether the current frame-compression operation is complete. 
  8093. Your compress-complete function must support the following interface:
  8094. pascal ComponentResult MyCompressCompleteFunction (SGChannel c,
  8095.                                                              short bufferNum,
  8096.                                                             Boolean *done,
  8097.                                                              SGCompressInfo *ci,                 
  8098.                                                             long refCon);
  8099. c    Specifies the reference that identifies the channel for this operation. 
  8100. bufferNum    Identifies the buffer for this operation. You can obtain information about this buffer by calling the SGGetBufferInfo function, which is described on page 5-102.
  8101. done    Contains a pointer to a Boolean value. Your function sets this Boolean value to indicate whether the frame has been completely compressed. Set the Boolean value to true if the compression is complete; set it to false if it is incomplete.
  8102. ci    Contains a pointer to a compression information structure (defined by the SGCompressInfo data type). If the compression is complete, your function must completely format this structure with information that is appropriate to the frame just compressed. See “The Compression Information Structure” beginning on page 5-22, for a description of this structure.
  8103. refCon    Contains a reference constant value. You can set this value by calling the SGSetChannelRefCon function, which is described on page 5-67.
  8104. DESCRIPTION
  8105. Once a frame has been completely compressed, you can add it to the movie.
  8106. SEE ALSO
  8107. Your compress-complete function can use the sequence grabber 
  8108. component’s SGCompressFrameComplete function to support the default behavior. SGCompressFrameComplete is described on page 5-106.
  8109. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  8110.  
  8111. Image Compression Manager errors
  8112. MyAddFrameFunction
  8113.  
  8114. The sequence grabber component calls your add-frame function in order to add a frame to a movie. Your add-frame function must support the following interface:
  8115. pascal ComponentResult MyAddFrameFunction (SGChannel c, 
  8116.                                                         short bufferNum,
  8117.                                                         TimeValue atTime, 
  8118.                                                         TimeScale scale,
  8119.                                                         SGCompressInfo *ci, 
  8120.                                                         long refCon);
  8121. c    Specifies the reference that identifies the channel for this operation. 
  8122. bufferNum    Identifies the buffer for this operation. You can obtain information about this buffer by calling the SGGetBufferInfo function, which is described on page 5-102.
  8123. atTime    Specifies the time at which the frame was captured, in the time scale specified by the scale parameter. Your add-frame function can change this value before adding the frame to the movie or before calling the SGAddFrame function, which is described on page 5-107. You can determine the duration of a frame by subtracting its capture time from the capture time of the next frame in the sequence.
  8124. scale    Specifies the time scale of the movie. You must not change this value.
  8125. ci    Contains a pointer to a compression information structure (defined by the SGCompressInfo data type). This structure contains information describing the compression characteristics of the image to be added to the movie. See “The Compression Information Structure” beginning on page 5-22 for a description of this structure.
  8126. refCon    Contains a reference constant value. You can set this value by calling the SGSetChannelRefCon function, which is described on page 5-67.
  8127. DESCRIPTION
  8128. You can use your add-frame function to modify the contents of the frame before it is added to the movie. This can be useful if you want to place frame numbers onto frames you are recording.
  8129. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  8130.  
  8131. Memory Manager errors
  8132. SEE ALSO
  8133. Your add-frame function can use the sequence grabber component’s SGAddFrame function to support the default behavior. SGAddFrame is described on page 5-107.
  8134. MyTransferFrameFunction
  8135.  
  8136. The sequence grabber component calls your transfer-frame function in order to move a video frame from the capture buffer into the channel’s filter buffer.
  8137. Your transfer-frame function must support the following interface:
  8138. pascal ComponentResult MyTransferFrameFunction (SGChannel c, 
  8139.                                                             short bufferNum,
  8140.                                                             MatrixRecord *mp,
  8141.                                                             RgnHandle clipRgn,
  8142.                                                             long refCon);
  8143. c    Specifies the reference that identifies the channel for this operation. 
  8144. bufferNum    Identifies the buffer for this operation. You can obtain information about this buffer by calling the SGGetBufferInfo function, which is described on page 5-102.
  8145. mp    Contains a pointer to a transformation matrix for the transfer operation. If there is no matrix for the operation, this parameter is set to nil.
  8146. clipRgn    Contains a handle to the clipping region for the destination image. 
  8147. This region is defined in the destination coordinate system. Apply 
  8148. the clipping region after applying the transformation matrix. If there is no clipping region, this parameter is set to nil.
  8149. refCon    Contains a reference constant value. You can set this value by calling the SGSetChannelRefCon function, which is described on page 5-67.
  8150. DESCRIPTION
  8151. The sequence grabber component calls this function only when you are filtering the video data. By filtering the video data through a filter buffer, you can eliminate some visual artifacts that result from noisy input video sources. Your application sets a filter buffer by calling the SGSetCompressBuffer function, which is described on page 5-87.
  8152. If you are using a grab-complete function to determine when frames have been grabbed, you should also implement a grab-compress–complete function (described in the next section). Otherwise, the channel will decompress the specified image before calling your grab-complete function, which will result in significantly lower performance. For details on grab-complete functions, see page 5-112.
  8153. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  8154.  
  8155. SEE ALSO
  8156. Your transfer-frame function can use the sequence grabber 
  8157. component’s SGTransferFrameForCompress function to support 
  8158. the default behavior—SGTransferFrameForCompress is described 
  8159. on page 5-108.
  8160. MyGrabCompressCompleteFunction
  8161.  
  8162. The sequence grabber calls your grab-compress–complete function when it 
  8163. is working with a video digitizer that supports compressed source data. Your grab-compress–complete function is responsible for determining whether the current compressed frame has been completely captured and compressed, essentially combining your grab-complete, compress, and compress-complete functions into one function.
  8164. Your function must support the following interface:
  8165. pascal ComponentResult MyGrabCompressCompleteFunction 
  8166.                                                             (SGChannel c,
  8167.                                                              Boolean *done, 
  8168.                                                              SGCompressInfo *ci,
  8169.                                                              TimeRecord *tr,
  8170.                                                              long refCon);
  8171. c    Identifies the channel for this operation. 
  8172. done    Contains a pointer to a Boolean value. Set this Boolean value to indicate whether you are finished. Set it to true when you are done; set it to false if the operation is incomplete. 
  8173. ci    Contains a pointer to a compression information structure. When the operation is complete, fill in this structure with information about the compression operation. The format and content of this structure are discussed earlier in this chapter, beginning on page 5-22.
  8174. tr    Contains a pointer to a time record. When the operation is complete, fill in this structure with information indicating when the frame was grabbed. The format and content of this structure are discussed in the chapter “Movie Toolbox” in Inside Macintosh: QuickTime.
  8175. refCon    Contains a reference constant value. You can set this value by calling the SGSetChannelRefCon function, which is described on page 5-67.
  8176. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  8177.  
  8178. SEE ALSO
  8179. Your grab-compress–complete function may use the sequence 
  8180. grabber’s SGGrabCompressComplete function to support the default behavior. SGGrabCompressComplete is discussed beginning on page 5-109.
  8181. MyDisplayCompressFunction
  8182.  
  8183. The sequence grabber calls your display-compress function when it is working with a video digitizer component that supports compressed source data. Your display-compress function is responsible for decompressing and displaying a compressed image.
  8184. pascal ComponentResult MyDisplayCompressFunction (SGChannel c,
  8185.                                                 Ptr dataPtr,                                                 
  8186.                                                 ImageDescriptionHandle desc,             
  8187.                                                 MatrixRecord *mp, 
  8188.                                                 RgnHandle clipRgn, 
  8189.                                                 long refCon);
  8190. c    Identifies the channel for this operation. The sequence grabber provides this value to your display-compress function.
  8191. dataPtr    Contains a pointer to the compressed image data. 
  8192. desc    Specifies a handle to the image description structure to use for the decompression operation. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information about this data structure.
  8193. mp    Contains a pointer to a matrix structure. This matrix structure contains the transformation matrix to use when displaying the image. If there is no matrix for the operation, this parameter is set to nil.
  8194. clipRgn    Contains a handle to the clipping region for the destination image. 
  8195. This region is defined in the destination coordinate system. Apply the clipping region after the transformation matrix. If there is no clipping region, this parameter is set to nil.
  8196. refCon    Contains a reference constant value. You can set this value by calling the SGSetChannelRefCon function, which is described on page 5-67.
  8197. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  8198.  
  8199. SEE ALSO
  8200. Your display-compress function may use the sequence grabber’s SGDisplayCompress function to support the default behavior. SGDisplayCompress is discussed beginning on page 5-110.
  8201. MyDataFunction
  8202.  
  8203. The sequence grabber calls your data function whenever any of the grabber’s channels write digitized data to the destination movie file. You assign a data function to the sequence grabber by calling the SGSetDataProc function, which is discussed on page 5-35.
  8204. Your data function must support the following interface:
  8205. pascal OSErr MyDataFunction (SGChannel c, Ptr p, long len, 
  8206.                                         long *offset, long chRefCon,
  8207.                                         TimeValue time, short writeType,
  8208.                                         long refCon);
  8209. c    Identifies the channel component that is writing the digitized data.
  8210. p    Contains a pointer to the digitized data.
  8211. len    Indicates the number of bytes of digitized data.
  8212. offset    Contains a pointer to a field that may specify where you are to write the digitized data, and that is to receive a value indicating where you wrote the data. You must update the field referred to by this parameter, supplying the value indicated by the writeType parameter. 
  8213. chRefCon    Contains control information. The low-order 16 bits contain sample flags for use by the Movie Toolbox’s AddMediaSample function (see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for information about these flags). The sequence grabber sets these flags as appropriate.
  8214.     The high-order 16 bits are reserved for Apple and are always set to 0.
  8215. time    Identifies the starting time of the data, in the channel’s time scale. You may use the SGGetChannelTimeScale function to retrieve the channel’s time scale (discussed on page 5-68).
  8216. writeType    Indicates the type of write operation being performed. The following values are defined:
  8217. seqGrabWriteAppend
  8218. Append the new data to the end of the file. Set the field referred to by the offset parameter to reflect the location at which you added the data.
  8219. seqGrabWriteReserve
  8220. Do not write any data to the output file. Instead, reserve space in the output file for the amount of data indicated by the len parameter. Set the field referred to by the offset parameter to the location of the reserved space.
  8221. seqGrabWriteFill    
  8222. Write the data into the location specified by the field referred to by the offset parameter. Set that field to the location of the byte following the last byte you wrote. 
  8223.     This option is used to fill the space reserved previously when the writeType parameter was set to seqGrabWriteReserve. Note that the sequence grabber may call your data function several times to fill a single reserved location.
  8224. refCon    Contains the reference constant you specified when you assigned your data function to the sequence grabber.
  8225. DESCRIPTION
  8226. The sequence grabber calls your data function whenever any channel component writes data to the destination movie. You may use your data function to store the digitized data in some format other than a QuickTime movie. 
  8227. RESULT CODES
  8228. File Manager errors
  8229. Memory Manager errors
  8230. SEE ALSO
  8231. You can instruct the sequence grabber not to write its data to a QuickTime movie by calling the SGSetDataOutput function and setting the seqGrabDontMakeMovie flag to 1. This can save processing time in cases where you do not want to create or update a movie. SGSetDataOutput is discussed on page 5-26.
  8232. MyModalFilter
  8233.  
  8234. The SGSettingsDialog function causes the sequence grabber to present its settings dialog box to the user. This is a movable modal dialog box, so you must provide a filter function to handle update events in your window. You specify your filter function with the proc parameter.
  8235. A modal-dialog filter function whose address is passed to SGSettingsDialog should support the following interface:
  8236. pascal Boolean MyModalFilter (DialogPtr theDialog, 
  8237.                                         EventRecord *theEvent, 
  8238.                                         short *itemHit, long refCon);
  8239. theDialog    Points to the settings dialog box’s dialog structure.
  8240. theEvent    Contains a pointer to an event structure. This event structure contains information identifying the nature of the event.
  8241. itemHit    Contains a pointer to a field that contains the item selected by the user. If you handle the event, you should update this field to reflect the item number of the selected item.
  8242. refCon    Contains a reference constant. You provide this reference constant to the sequence grabber in the procRefNum parameter of the SGSettingsDialog function, which is described on page 5-48.
  8243. DESCRIPTION
  8244. Your modal-dialog filter function returns a Boolean value that indicates whether you handled the event. Set this value to true if you handled the event; otherwise, set it to false. If you handle the event, be sure to update the value of the field referred to by the itemHit parameter.
  8245. SEE ALSO
  8246. See Inside Macintosh: Files for a sample modal-dialog filter function.
  8247.  
  8248.  
  8249. Summary of Sequence Grabber Components
  8250.  
  8251. C Summary
  8252.  
  8253. Constants
  8254.  
  8255. /* sequence grabber component type */
  8256. #define SeqGrabComponentType 'barg'
  8257.  
  8258. /* sequence grabber channel type */
  8259. #define SeqGrabChannelType 'sgch'
  8260. /* SGGrabPict function grabPictFlags parameter flags */
  8261. enum {
  8262.         grabPictOffScreen = 1,                                    /* place in offscreen graphics world */
  8263.         grabPictIgnoreClip = 2                                    /* ignore channel clipping regions */
  8264.     };
  8265. /* flag for SGSetFlags and SGGetFlags functions */
  8266. #define sgFlagControlledGrab (1)                            /* controlled grab */
  8267. /* flags for SGSetChannelPlayFlags and SGGetChannelPlayFlags functions */
  8268. #define channelPlayNormal 0                                            /* use default playback methodology */
  8269. #define channelPlayFast 1                                            /* achieve fast playback rate */
  8270. #define channelPlayHighQuality 2                                            /* achieve high quality image */
  8271. #define channelPlayAllData 4                                            /* play all captured data */
  8272. /* flags for SGSetDataOutput and SGGetDataOutput functions */
  8273. enum {
  8274.     seqGrabToDisk                                     = 1,        /* write recorded data to movie */
  8275.     seqGrabToMemory                                     = 2,        /* store recorded data in memory */
  8276.     seqGrabDontUseTempMemory                                     = 4,        /* no temporary memory for recorded 
  8277.                                                     data */
  8278.     seqGrabAppendToFile                                     = 8,        /* add recorded data to file's data 
  8279.                                                     fork */
  8280.     seqGrabDontAddMovieResource = 16, /* don't add movie resource to file */
  8281.     seqGrabDontMakeMovie                                     = 32        /* don't put data into movie */
  8282. };
  8283. typedef unsigned char SeqGrabDataOutputEnum;
  8284. /* usage flags for SGSetChannelUsage and SGGetChannelUsage functions */
  8285. enum {
  8286.     seqGrabRecord                                 = 1,        /* used during record operations */
  8287.     seqGrabPreview                                 = 2,        /* used during preview operations */
  8288.     seqGrabPlayDuringRecord     = 4                                    /* plays data during record operation */
  8289. };
  8290. typedef unsigned char SeqGrabUsageEnum;
  8291. /* SGGetChannelInfo function flags */
  8292. enum {
  8293.     seqGrabHasBounds                                     = 1,        /* visual representation of data */
  8294.     seqGrabHasVolume                                     = 2,        /* audio representation of data */ 
  8295.     seqGrabHasDiscreteSamples                                     = 4        /* data organized in discrete frames */
  8296. };typedef unsigned char SeqGrabChannelInfoEnum;
  8297.  
  8298. /*    device list structure flags */
  8299.  
  8300. #define sgDeviceListWithIcons (1)                                                                /* include icons */
  8301. #define sgDeviceListDontCheckAvailability (2)                                                                /* don't check available */
  8302.  
  8303. /*    data function write operation types */
  8304.  
  8305. enum {
  8306.     seqGrabWriteAppend,                                            /* append to file */
  8307.     seqGrabWriteReserve,                                            /* reserve space in file */
  8308.     seqGrabWriteFill                                            /* fill reserved space */
  8309. };
  8310.  
  8311. /*    SGPause and SGGetPause options */
  8312.  
  8313. enum {
  8314.     seqGrabUnpause = 0,                                                        /* release grabber */
  8315.     seqGrabPause = 1,                                                        /* pause all playback */
  8316.     seqGrabPauseForMenu = 3                                                        /* pause for menu display */
  8317. };
  8318. /* selectors for basic sequence grabber component functions */
  8319.     kSGInitializeSelect                                             = 0x1;             /* SGInitialize */
  8320.     kSGSetDataOutputSelect                                             = 0x2;            /* SGSetDataOutput */
  8321.     kSGGetDataOutputSelect                                             = 0x3;             /* SGGetDataOutput */
  8322.     kSGSetGWorldSelect                                             = 0x4;             /* SGSetGWorld */
  8323.     kSGGetGWorldSelect                                             = 0x5;            /* SGGetGWorld */                        
  8324.     kSGNewChannelSelect                                             = 0x6;             /* SGNewChannel */
  8325.     kSGDisposeChannelSelect                                             = 0x7;             /* SGDisposeChannel */
  8326.     kSGStartPreviewSelect                                             = 0x10;            /* SGStartPreview */
  8327.     kSGStartRecordSelect                                             = 0x11;             /* SGStartRecord */
  8328.     kSGIdleSelect                                             = 0x12;             /* SGIdle */
  8329.     kSGStopSelect                                             = 0x13;             /* SGStop */
  8330.     kSGPauseSelect                                             = 0x14;            /* SGPause */
  8331.     kSGPrepareSelect                                             = 0x15;             /* SGPrepare */
  8332.     kSGReleaseSelect                                             = 0x16;             /* SGRelease */
  8333.     kSGGetMovieSelect                                             = 0x17;             /* SGGetMovie */
  8334.     kSGSetMaximumRecordTimeSelect                                             = 0x18;             /* SGSetMaximumRecordTime */
  8335.     kSGGetMaximumRecordTimeSelect                                             = 0x19;            /* SGGetMaximumRecordTime */
  8336.     kSGGetStorageSpaceRemainingSelect                                            = 0x1a;            /* SGGetStorageSpaceRemaining */                                            
  8337.     kSGGetTimeRemainingSelect                                             = 0x1b;             /* SGGetTimeRemaining */                                    
  8338.     kSGGrabPictSelect                                             = 0x1c;             /* SGGrabPict */
  8339.     kSGGetLastMovieResIDSelect                                             = 0x1d;             /* SGGetLastMovieResID */
  8340.     kSGSetFlagsSelect                                             = 0x1e;             /* SGSetFlags */
  8341.     kSGGetFlagsSelect                                             = 0x1f;             /* SGGetFlags */
  8342.     kSGSetDataProcSelect                                             = 0x20;            /* SGSetDataProc */
  8343.     kSGNewChannelFromComponentSelect = 0x21;                                                        /* SGNewChannelFromComponent */
  8344.     kSGDisposeDeviceListSelect                                             = 0x22;            /* SGDisposeDeviceList */
  8345.     kSGAppendDeviceListToMenuSelect                                             = 0x23;            /* SGAppendDeviceListToMenu */
  8346.     kSGSetSettingsSelect                                             = 0x24;            /* SGSetSettings */
  8347.     kSGGetSettingsSelect                                             = 0x25;            /* SGGetSettings */
  8348.     kSGGetIndChannelSelect                                             = 0x26;            /* SGGetIndChannel */
  8349.     kSGUpdateSelect                                             = 0x27;            /* SGUpdate */
  8350.     kSGGetPauseSelect                                             = 0x28;            /* SGGetPause */
  8351.     kSGSettingsDialogSelect                                             = 0x29;            /* SGSettingsDialog */
  8352.     kSGGetAlignmentProcSelect                                             = 0x2A;            /* SGGetAlignmentProc */
  8353.     kSGSetChannelSettingsSelect                                             = 0x2B;            /* SGSetChannelSettings */
  8354.     kSGGetChannelSettingsSelect                                             = 0x2C;            /* SGGetChannelSettings */
  8355.  
  8356. /* selectors for common channel configuration functions */
  8357.     kSGCSetChannelUsageSelect                                         = 0x80;                  /* SGCSetChannelUsage */
  8358.     kSGCGetChannelUsageSelect                                         = 0x81;                  /* SGCGetChannelUsage */
  8359.     kSGCSetChannelBoundsSelect                                         = 0x82;                  /* SGCSetChannelBounds */
  8360.     kSGCGetChannelBoundsSelect                                         = 0x83;                  /* SGCGetChannelBounds */
  8361.     kSGCSetChannelVolumeSelect                                         = 0x84;                  /* SGCSetChannelVolume */
  8362.     kSGCGetChannelVolumeSelect                                         = 0x85;                  /* SGCGetChannelVolume */
  8363.     kSGCGetChannelInfoSelect                                         = 0x86;                /* SGCGetChannelInfo */
  8364.     kSGCSetChannelPlayFlagsSelect                                         = 0x87;                  /* SGCSetChannelPlayFlags */                                         
  8365.     kSGCGetChannelPlayFlagsSelect                                         = 0x88;                  /* SGCGetChannelPlayFlags */
  8366.     kSGCSetChannelMaxFramesSelect                                         = 0x89;                  /* SGCSetChannelMaxFrames */
  8367.     kSGCGetChannelMaxFramesSelect                                         = 0x8a;                  /* SGCGetChannelMaxFrames */
  8368.     kSGCSetChannelRefConSelect                                         = 0x8b;                  /* SGCSetChannelRefCon */
  8369.     kSGCSetChannelClipSelect                                         = 0x8C;                /* SGCSetChannelClip */
  8370.     kSGCGetChannelClipSelect                                         = 0x8D;                /* SGCGetChannelClip */
  8371.     kSGCGetChannelSampleDescriptionSelect = 0x8E;
  8372.                                                     /* SGCGetChannelSampleDescription */
  8373.     kSGCGetChannelDeviceListSelect                                             = 0x8F;            /* SGCGetChannelDeviceList */
  8374.     kSGCSetChannelDeviceSelect                                             = 0x90;            /* SGCSetChannelDevice */
  8375.     kSGCSetChannelMatrixSelect                                             = 0x91;            /* SGCSetChannelMatrix */
  8376.     kSGCGetChannelMatrixSelect                                             = 0x92;            /* SGCGetChannelMatrix */
  8377.     kSGCGetChannelTimeScaleSelect                                             = 0x93;            /* SGCGetChannelTimeScale */
  8378.     
  8379.     /* selectors for video channel configuration functions */
  8380.     kSGCGetSrcVideoBoundsSelect                                             = 0x100;            /* SGCGetSrcVideoBounds */
  8381.     kSGCSetVideoRectSelect                                             = 0x101;            /* SGCSetVideoRect */
  8382.     kSGCGetVideoRectSelect                                             = 0x102;            /* SGCGetVideoRect */
  8383.     kSGCGetVideoCompressorTypeSelect                                             = 0x103;            /* SGCGetVideoCompressorType */
  8384.     kSGCSetVideoCompressorTypeSelect                                             = 0x104;            /* SGCSetVideoCompressorType */
  8385.     kSGCSetVideoCompressorSelect                                             = 0x105;            /* SGCSetVideoCompressor */
  8386.     kSGCGetVideoCompressorSelect                                             = 0x106;            /* SGCGetVideoCompressor */
  8387.     kSGCGetVideoDigitizerComponentSelect 
  8388.                                                 = 0x107;    
  8389.                                                         /* SGCGetVideoDigitizerComponent */
  8390.     kSGCSetVideoDigitizerComponentSelect 
  8391.                                                 = 0x108; 
  8392.                                                         /* SGCSetVideoDigitizerComponent */
  8393.     kSGCVideoDigitizerChangedSelect                                             = 0x109;            /* SGCVideoDigitizerChanged */
  8394.     kSGCSetVideoBottlenecksSelect                                            = 0x10a;            /* SGCSetVideoBottlenecks */
  8395.     kSGCGetVideoBottlenecksSelect                                             = 0x10b;            /* SGCGetVideoBottlenecks */
  8396.     kSGCGrabFrameSelect                                             = 0x10c;            /* SGCGrabFrame */
  8397.     kSGCGrabFrameCompleteSelect                                             = 0x10d;            /* SGCGrabFrameComplete */
  8398.     kSGCDisplayFrameSelect                                             = 0x10e;            /* SGCDisplayFrame */
  8399.     kSGCCompressFrameSelect                                             = 0x10f;            /* SGCCompressFrame */
  8400.     kSGCCompressFrameCompleteSelect                                             = 0x110;            /* SGCCompressFrameComplete */
  8401.     kSGCAddFrameSelect                                             = 0x111;            /* SGCAddFrame */
  8402.     kSGCTransferFrameForCompressSelect = 0x112;
  8403.                                                         /* SGCTransferFrameForCompress */
  8404.     kSGCSetCompressBufferSelect                                             = 0x113;            
  8405.                                                             /* SGCSetCompressBuffer */
  8406.     kSGCGetCompressBufferSelect                                             = 0x114;            
  8407.                                                              /* SGCGetCompressBuffer */
  8408.     kSGCGetBufferInfoSelect                                             = 0x115;            /* SGCGetBufferInfo */
  8409.     kSGCSetUseScreenBufferSelect                                             = 0x116;            /* SGCSetUseScreenBuffer */
  8410.     kSGCGetUseScreenBufferSelect                                             = 0x117;            /* SGCGetUseScreenBuffer */
  8411.     kSGCGrabCompressCompleteSelect                                             = 0x118; /* SGCGrabCompressComplete */
  8412.     kSGCDisplayCompressSelect                                             = 0x119; /* SGCDisplayCompress */
  8413.     kSGCSetFrameRateSelect                                             = 0x11A; /* SGCSetFrameRate */
  8414.     kSGCGetFrameRateSelect                                             = 0x11B; /* SGCGetFrameRate */
  8415.      
  8416.     /* selectors for sound channel configuration functions */
  8417.     kSGCSetSoundInputDriverSelect                                                 = 0x100;            /* SGCSetSoundInputDriver */
  8418.     kSGCGetSoundInputDriverSelect                                                 = 0x101;            /* SGCGetSoundInputDriver */
  8419.     kSGCSoundInputDriverChangedSelect                                                 = 0x102;            
  8420.                                                     /* SGCSoundInputDriverChanged */
  8421.     kSGCSetSoundRecordChunkSizeSelect                                                 = 0x103;            
  8422.                                                     /* SGCSetSoundRecordChunkSize */
  8423.     kSGCGetSoundRecordChunkSizeSelect                                                 = 0x104;    
  8424.                                                     /* SGCGetSoundRecordChunkSize */
  8425.     kSGCSetSoundInputRateSelect                                                 = 0x105;     /* SGCSetSoundInputRate */
  8426.     kSGCGetSoundInputRateSelect                                                 = 0x106;     /* SGCGetSoundInputRate */
  8427.     kSGCSetSoundInputParametersSelect                                                 = 0x107; 
  8428.                                                             /* SGCSetSoundInputParameters */
  8429.     kSGCGetSoundInputParametersSelect                                                 = 0x108;
  8430.                                                             /* SGCGetSoundInputParameters */
  8431.     
  8432.     /* selectors for utility functions provided to channel components */
  8433.     kSGWriteMovieDataSelect                                             = 0x100; /* SGWriteMovieData */
  8434.     kSGAddFrameReferenceSelect                                             = 0x101; / *SGAddFrameReference */
  8435.     kSGGetNextFrameReferenceSelect                                             = 0x102; /* SGGetNextFrameReference */
  8436.     kSGGetTimeBaseSelect                                             = 0x103; /* SGGetTimeBase */
  8437.     kSGSortDeviceListSelect                                             = 0x104; /* SGSortDeviceList */
  8438.     kSGAddMovieDataSelect                                             = 0x105; /* SGAddMovieData */
  8439.     kSGChangedSourceSelect                                             = 0x106; /* SGChangedSource */
  8440. Data Types
  8441.  
  8442. struct SGCompressInfo {
  8443.     Ptr                    buffer;                /* buffer for compressed image */
  8444.     unsigned long                    bufferSize;                /* bytes of image data in buffer */
  8445.     unsigned char                    similarity;                /* relative similarity */
  8446.     unsigned char                    reserved;                /* reserved--set to 0 */
  8447. };
  8448. typedef struct SGCompressInfo SGCompressInfo;
  8449. struct SeqGrabFrameInfo {
  8450.     long                 frameOffset;                    /* offset to the sample */
  8451.     long                 frameTime;                    /* time that frame was captured */
  8452.     long                 frameSize;                    /* number of bytes in sample */
  8453.     SGChannel                 frameChannel;                    /* current connection to channel */
  8454.     long                 frameRefCon;                    /* reference constant for channel */
  8455. };
  8456. struct VideoBottles {
  8457.     short                                     procCount;                            /* count of callbacks */
  8458.     GrabProc                                     grabProc;                            /* grab function */
  8459.     GrabCompleteProc                                     grabCompleteProc;                            /* grab-complete 
  8460.                                                                         function */
  8461.     DisplayProc                                     displayProc;                            /* display function */
  8462.     CompressProc                                     compressProc;                            /* compress function */
  8463.     CompressCompleteProc                                     compressCompleteProc;
  8464.                                                                     /* compress-complete
  8465.                                                                         function */
  8466.     AddFrameProc                                     addFrameProc;                            /* add-frame function */
  8467.     TransferFrameProc                                     transferFrameProc;                            /* transfer-frame 
  8468.                                                                         function */
  8469.     GrabCompressCompleteProc                                    grabCompressCompleteProc;
  8470.                                                                     /* grab-compress–complete
  8471.                                                                         function */
  8472.     DisplayCompressProc                                    displayCompressProc;                            /* display-compress
  8473.                                                                         function */
  8474. };
  8475. typedef struct VideoBottles VideoBottles;
  8476. typedef struct SGDeviceListRecord {
  8477.     short                    count;                        /* count of devices */
  8478.     short                    selectedIndex;                        /* current device */
  8479.     long                    reserved;                        /* set to 0 */
  8480.     SGDeviceName                    entry[1];                        /* device names */
  8481. } SGDeviceListRecord, *SGDeviceListPtr, **SGDeviceList;
  8482. typedef struct SGDeviceName {    
  8483.     Str63                name;                        /* device name */
  8484.     Handle                icon;                        /* device icon */
  8485.     long                flags;                        /* flags */
  8486.     long                refCon;                        /* set to 0 */
  8487.     long                reserved;                        /* set to 0 */
  8488. } SGDeviceName;
  8489. Sequence Grabber Component Functions
  8490.  
  8491. Configuring Sequence Grabber Components
  8492. pascal ComponentResult SGInitialize
  8493. (SeqGrabComponent s);
  8494. pascal ComponentResult SGSetDataOutput 
  8495. (SeqGrabComponent s, FSSpec *movieFile,
  8496. long whereFlags);
  8497. pascal ComponentResult SGGetDataOutput 
  8498. (SeqGrabComponent s,
  8499. FSSpec *movieFile, long *whereFlags);
  8500. pascal ComponentResult SGSetGWorld
  8501. (SeqGrabComponent s, CGrafPtr gp, GDHandle gd);
  8502. pascal ComponentResult SGGetGWorld    
  8503. (SeqGrabComponent s, CGrafPtr *gp, 
  8504. GDHandle *gd);
  8505. pascal ComponentResult SGNewChannel
  8506. (SeqGrabComponent s, OSType channelType, SGChannel *ref);
  8507. pascal ComponentResult SGNewChannelFromComponent 
  8508. (SeqGrabComponent s, SGChannel *newChannel, 
  8509. Component sgChannelComponent);
  8510. pascal ComponentResult SGGetIndChannel 
  8511. (SeqGrabComponent s, short index, 
  8512. SGChannel *ref, OSType *chanType);
  8513. pascal ComponentResult SGDisposeChannel
  8514. (SeqGrabComponent s, SGChannel c);
  8515. pascal ComponentResult SGSetDataProc 
  8516. (SeqGrabComponent sg, SGDataProc proc, 
  8517. long refCon);
  8518. pascal ComponentResult SGGetAlignmentProc 
  8519. (SeqGrabComponent s, 
  8520. AlignmentProcRecordPtr alignmentProc);
  8521. Controlling Sequence Grabber Components
  8522. pascal ComponentResult SGStartPreview
  8523. (SeqGrabComponent s);
  8524. pascal ComponentResult SGStartRecord
  8525. (SeqGrabComponent s);
  8526. pascal ComponentResult SGIdle
  8527. (SeqGrabComponent s);
  8528. pascal ComponentResult SGUpdate 
  8529. (SeqGrabComponent s, RgnHandle updateRgn);
  8530. pascal ComponentResult SGStop
  8531. (SeqGrabComponent s);
  8532. pascal ComponentResult SGPause
  8533. (SeqGrabComponent s, Byte pause);
  8534. pascal ComponentResult SGGetPause 
  8535. (SeqGrabComponent s, Byte *paused);
  8536. pascal ComponentResult SGPrepare
  8537. (SeqGrabComponent s, Boolean prepareForPreview, 
  8538. Boolean prepareForRecord);
  8539. pascal ComponentResult SGRelease
  8540. (SeqGrabComponent s);
  8541. pascal Movie SGGetMovie    (SeqGrabComponent s);
  8542. pascal ComponentResult SGGetLastMovieResID 
  8543. (SeqGrabComponent s, short *resID);
  8544. pascal ComponentResult SGGrabPict 
  8545. (SeqGrabComponent s, PicHandle *p, 
  8546. const Rect *bounds, short offscreenDepth, 
  8547. long grabPictFlags);
  8548. Working With Sequence Grabber Settings
  8549. pascal ComponentResult SGSettingsDialog 
  8550. (SeqGrabComponent s, SGChannel c, 
  8551. short numPanels, Component *panelList, 
  8552. long flags, SGModalFilterProcPtr proc, 
  8553. long procRefNum);
  8554. pascal ComponentResult SGGetSettings 
  8555. (SeqGrabComponent s, UserData *ud, long flags);
  8556. pascal ComponentResult SGSetSettings 
  8557. (SeqGrabComponent s, UserData ud, long flags);
  8558. pascal ComponentResult SGGetChannelSettings 
  8559. (SeqGrabComponent s, SGChannel c, UserData *ud, long flags);
  8560. pascal ComponentResult SGSetChannelSettings 
  8561. (SeqGrabComponent s, SGChannel c, UserData ud, long flags);
  8562. Working With Sequence Grabber Characteristics
  8563. pascal ComponentResult SGSetMaximumRecordTime
  8564. (SeqGrabComponent s, unsigned long ticks);
  8565. pascal ComponentResult SGGetMaximumRecordTime 
  8566. (SeqGrabComponent s, unsigned long *ticks);
  8567. pascal ComponentResult SGGetStorageSpaceRemaining 
  8568. (SeqGrabComponent s, unsigned long *bytes);
  8569. pascal ComponentResult SGGetTimeRemaining 
  8570. (SeqGrabComponent s, long *ticksLeft);
  8571. pascal ComponentResult SGGetTimeBase
  8572. (SeqGrabComponent s, TimeBase *tb);
  8573. pascal ComponentResult SGSetFlags 
  8574. (SeqGrabComponent s, long sgFlags);
  8575. pascal ComponentResult SGGetFlags
  8576. (SeqGrabComponent s, long *sgFlags);
  8577. Working With Channel Characteristics
  8578. pascal ComponentResult SGSetChannelUsage
  8579. (SGChannel c, long usage);
  8580. pascal ComponentResult SGGetChannelUsage
  8581. (SGChannel c, long *usage);
  8582. pascal ComponentResult SGGetChannelInfo
  8583. (SGChannel c, long *channelInfo);
  8584. pascal ComponentResult SGSetChannelPlayFlags
  8585. (SGChannel c, long playFlags);
  8586. pascal ComponentResult SGGetChannelPlayFlags
  8587. (SGChannel c, long *playFlags);
  8588. pascal ComponentResult SGSetChannelMaxFrames
  8589. (SGChannel c, long frameCount);
  8590. pascal ComponentResult SGGetChannelMaxFrames
  8591. (SGChannel c, long *frameCount);
  8592. pascal ComponentResult SGSetChannelBounds
  8593. (SGChannel c, const Rect *bounds);
  8594. pascal ComponentResult SGGetChannelBounds
  8595. (SGChannel c, Rect *bounds);
  8596. pascal ComponentResult SGSetChannelVolume
  8597. (SGChannel c, short volume);
  8598. pascal ComponentResult SGGetChannelVolume
  8599. (SGChannel c, short *volume);
  8600. pascal ComponentResult SGSetChannelRefCon
  8601. (SGChannel c, long refCon);
  8602. pascal ComponentResult SGGetChannelSampleDescription 
  8603. (SGChannel c, Handle sampleDesc);
  8604. pascal ComponentResult SGGetChannelTimeScale 
  8605. (SGChannel c, TimeScale *scale);
  8606. pascal ComponentResult SGSetChannelClip 
  8607. (SGChannel c, RgnHandle theClip);
  8608. pascal ComponentResult SGGetChannelClip 
  8609. (SGChannel c, RgnHandle *theClip);
  8610. pascal ComponentResult SGSetChannelMatrix 
  8611. (SGChannel c, const MatrixRecord *m);
  8612. pascal ComponentResult SGGetChannelMatrix 
  8613. (SGChannel c, MatrixRecord *m);
  8614. Working With Channel Devices
  8615. pascal ComponentResult SGGetChannelDeviceList 
  8616. (SGChannel c, long selectionFlags, 
  8617. SGDeviceList *list);
  8618. pascal ComponentResult SGDisposeDeviceList 
  8619. (SeqGrabComponent s, SGDeviceList list);
  8620. pascal ComponentResult SGAppendDeviceListToMenu 
  8621. (SeqGrabComponent s, SGDeviceList list, MenuHandle mh);
  8622. pascal ComponentResult SGSetChannelDevice 
  8623. (SGChannel c, StringPtr name);
  8624. Working With Video Channels
  8625. pascal ComponentResult SGGetSrcVideoBounds 
  8626. (SGChannel c, Rect *r);
  8627. pascal ComponentResult SGSetVideoRect
  8628. (SGChannel c, Rect *r);
  8629. pascal ComponentResult SGGetVideoRect 
  8630. (SGChannel c, Rect *r);
  8631. pascal ComponentResult SGSetVideoCompressorType
  8632. (SGChannel c, OSType compressorType);
  8633. pascal ComponentResult SGGetVideoCompressorType
  8634. (SGChannel c, OSType *compressorType);
  8635. pascal ComponentResult SGSetVideoCompressor
  8636. (SGChannel c, short depth, 
  8637. CompressorComponent compressor, 
  8638. CodecQ spatialQuality, 
  8639. CodecQ temporalQuality, long keyFrameRate);
  8640. pascal ComponentResult SGGetVideoCompressor
  8641. (SGChannel c, short *depth, 
  8642. CompressorComponent *compressor, 
  8643. CodecQ *spatialQuality, 
  8644. CodecQ *temporalQuality, long *keyFrameRate);
  8645. pascal ComponentResult SGSetVideoDigitizerComponent
  8646. (SGChannel c, ComponentInstance vdig);
  8647. pascal ComponentInstance SGGetVideoDigitizerComponent
  8648. (SGChannel c);
  8649. pascal ComponentResult SGVideoDigitizerChanged
  8650. (SGChannel c);
  8651. pascal ComponentResult SGSetCompressBuffer
  8652. (SGChannel c, short depth, 
  8653. const Rect *compressSize);
  8654. pascal ComponentResult SGGetCompressBuffer
  8655. (SGChannel c, short *depth, Rect *compressSize);
  8656. pascal ComponentResult SGSetFrameRate 
  8657. (SGChannel c, Fixed frameRate);
  8658. pascal ComponentResult SGGetFrameRate 
  8659. (SGChannel c, Fixed *frameRate);
  8660. pascal ComponentResult SGSetUseScreenBuffer 
  8661. (SGChannel c, Boolean useScreenBuffer);
  8662. pascal ComponentResult SGGetUseScreenBuffer 
  8663. (SGChannel c, Boolean *useScreenBuffer);
  8664. Working With Sound Channels
  8665. pascal ComponentResult SGSetSoundInputDriver
  8666. (SGChannel c, const Str255 driverName);
  8667. pascal long SGGetSoundInputDriver
  8668. (SGChannel c);
  8669. pascal ComponentResult SGSoundInputDriverChanged
  8670. (SGChannel c);
  8671. pascal ComponentResult SGSetSoundRecordChunkSize
  8672. (SGChannel c, long seconds);
  8673. pascal long SGGetSoundRecordChunkSize
  8674. (SGChannel c);
  8675. pascal ComponentResult SGSetSoundInputRate
  8676. (SGChannel c, Fixed rate);
  8677. pascal Fixed SGGetSoundInputRate
  8678. (SGChannel c); 
  8679. pascal ComponentResult SGSetSoundInputParameters 
  8680. (SGChannel c, short sampleSize, 
  8681. short numChannels, OSType compressionType);
  8682. pascal ComponentResult SGGetSoundInputParameters 
  8683. (SGChannel c, short *sampleSize, 
  8684. short *numChannels, OSType *compressionType);
  8685. Video Channel Callback Functions
  8686. pascal ComponentResult SGSetVideoBottlenecks
  8687. (SGChannel c, VideoBottles *vb);
  8688. pascal ComponentResult SGGetVideoBottlenecks
  8689. (SGChannel c, VideoBottles *vb);
  8690. Utility Functions for Video Channel Callback Functions
  8691. pascal ComponentResult SGGetBufferInfo
  8692. (SGChannel c, short bufferNum, 
  8693. PixMapHandle *bufferPM, Rect *bufferRect, 
  8694. GWorldPtr *compressBuffer, 
  8695. Rect *compressBufferRect);
  8696. pascal ComponentResult SGGrabFrame
  8697. (SGChannel c, short bufferNum);
  8698. pascal ComponentResult SGGrabFrameComplete
  8699. (SGChannel c, short bufferNum, Boolean *done);
  8700. pascal ComponentResult SGDisplayFrame
  8701. (SGChannel c, short bufferNum, 
  8702. MatrixRecord *mp, RgnHandle clipRgn);
  8703. pascal ComponentResult SGCompressFrame
  8704. (SGChannel c, short bufferNum);
  8705. pascal ComponentResult SGCompressFrameComplete
  8706. (SGChannel c, short bufferNum, Boolean *done, SGCompressInfo *ci);
  8707. pascal ComponentResult SGAddFrame
  8708. (SGChannel c, short bufferNum, 
  8709. TimeValue atTime, TimeScale scale, 
  8710. const SGCompressInfo *ci);
  8711. pascal ComponentResult SGTransferFrameForCompress
  8712. (SGChannel c, short bufferNum, MatrixRecord *mp, 
  8713. RgnHandle clipRgn);
  8714. pascal ComponentResult SGGrabCompressComplete 
  8715. (SGChannel c, Boolean *done, 
  8716. SGCompressInfo *ci, TimeRecord *tr);
  8717. pascal ComponentResult SGDisplayCompress 
  8718. (SGChannel c, Ptr dataPtr, ImageDescriptionHandle desc, MatrixRecord *mp, RgnHandle clipRgn);
  8719. Application-Defined Functions
  8720.  
  8721. pascal ComponentResult MyGrabFunction 
  8722. (SGChannel c, short bufferNum, long refCon);
  8723. pascal ComponentResult MyGrabCompleteFunction 
  8724. (SGChannel c, short bufferNum, Boolean *done, long refCon);
  8725. pascal ComponentResult MyDisplayFunction 
  8726. (SGChannel c, short bufferNum, 
  8727. MatrixRecord *mp, RgnHandle clipRgn, 
  8728. long refCon);
  8729. pascal ComponentResult MyCompressFunction 
  8730. (SGChannel c, short bufferNum, long refCon);
  8731. pascal ComponentResult MyCompressCompleteFunction 
  8732. (SGChannel c, short bufferNum, Boolean *done,
  8733. SGCompressInfo *ci, long refCon);
  8734. pascal ComponentResult MyAddFrameFunction 
  8735. (SGChannel c, short bufferNum,
  8736. TimeValue atTime, TimeScale scale,
  8737. SGCompressInfo ci, long refCon);
  8738. pascal ComponentResult MyTransferFrameFunction 
  8739. (SGChannel c,                                                             short bufferNum,                                                             MatrixRecord *mp,
  8740. RgnHandle clipRgn,                                                             long refCon);
  8741. pascal ComponentResult MyGrabCompressCompleteFunction 
  8742. (SGChannel c, Boolean *done, 
  8743. SGCompressInfo *ci, TimeRecord *tr, 
  8744. long refCon);
  8745. pascal ComponentResult MyDisplayCompressFunction 
  8746. (SGChannel c, Ptr dataPtr, ImageDescriptionHandle desc, MatrixRecord *mp, RgnHandle clipRgn, long refCon);
  8747. pascal OSErr MyDataFunction    (SGChannel c, Ptr p, long len, long *offset, long chRefCon, TimeValue time, 
  8748. short writeType, long refCon);
  8749. pascal Boolean MyModalFilter
  8750. (DialogPtr theDialog, EventRecord *theEvent, short *itemHit, long refCon);
  8751. Pascal Summary
  8752.  
  8753. Constants
  8754.  
  8755. CONST
  8756.     {sequence grabber component type}
  8757.     SeqGrabComponentType                                        = 'barg';
  8758.  
  8759.     {sequence grabber channel type}
  8760.     SeqGrabChannelType                                         = 'sgch'
  8761.  
  8762.     {SGGrabPict function grabPictFlags parameter flags}
  8763.     grabPictOffScreen                                        = 1;        {place in offscreen graphics world}
  8764.     grabPictIgnoreClip                                         = 2;        {ignore channel clipping regions}
  8765.     
  8766.     {flag for SGSetFlags and SGGetFlags functions}
  8767.     sgFlagControlledGrab                                        = 1;        {controlled grab}
  8768.  
  8769.     {flags for SGSetChannelPlayFlags and SGGetChannelPlayFlags functions}    
  8770.     channelPlayNormal                                        = 0;        {use default playback methodology}
  8771.     channelPlayFast                                        = 1;        {achieve fast playback rate}
  8772.     channelPlayHighQuality                                        = 2;        {achieve high quality image}
  8773.     channelPlayAllData                                        = 4;        {play all captured data}
  8774.     
  8775.     {flags for SGSetDataOutput and SGGetDataOutput functions}
  8776.     seqGrabToDisk                                         = 1;        {write recorded data to specified }
  8777.                                                     { QuickTime movie}
  8778.     seqGrabToMemory                                         = 2;        {store recorded data in memory until }
  8779.                                                     { completion of recording process}
  8780.     seqGrabDontUseTempMemory                                         = 4;        {don't use temporary memory to store }
  8781.                                                     { recorded data}
  8782.     seqGrabAppendToFile                                         = 8;        {add recorded data to data fork of }
  8783.                                                     { specified movie file}
  8784.     seqGrabDontAddMovieResource                                         = 16;        {don't add movie resource to }
  8785.                                                     { specified movie file}
  8786.  
  8787.     {usage flags for SGSetChannelUsage and SGGetChannelUsage functions}
  8788.     seqGrabRecord                                             = 1;        {used during record operations}
  8789.     seqGrabPreview                                             = 2;        {used during preview operations}
  8790.     seqGrabPlayDuringRecord                                             = 4;        {used during record operations}
  8791.     
  8792.     {SGGetChannelInfo function flags}
  8793.     seqGrabHasBounds                                             = 1;        {visual representation of data}
  8794.     seqGrabHasVolume                                             = 2;        {audio representation of data}
  8795.     seqGrabHasDiscreteSamples                                             = 4;        {data organized in discrete frames}
  8796.  
  8797.     {device list structure flags}
  8798.     sgDeviceListWithIcons                                                 = 1;        {include icons}
  8799.     sgDeviceListDontCheckAvailability                                                 = 2;        {do not check availability }
  8800.                                                             { of device}
  8801.     {data function write operation types}
  8802.     seqGrabWriteAppend                                = 0;        {append to file}
  8803.     seqGrabWriteReserve                                = 1;        {reserve space in file}
  8804.     seqGrabWrite                                = 2;        {fill reserved space}
  8805.     {SGPause and SGGetPause options}
  8806.     seqGrabUnpause                            = 0;            {release grabber}
  8807.     seqGrabPause                            = 1;            {pause all playback}
  8808.     seqGrabPauseForMenu                            = 3;            {pause for menu display}
  8809.     
  8810.     {selectors for basic sequence grabber component functions}
  8811.     kSGInitializeSelect                                             = $1;             {SGInitialize}
  8812.     kSGSetDataOutputSelect                                             = $2;            {SGSetDataOutput}
  8813.     kSGGetDataOutputSelect                                             = $3;             {SGGetDataOutput}
  8814.     kSGSetGWorldSelect                                             = $4;             {SGSetGWorld}
  8815.     kSGGetGWorldSelect                                             = $5;            {SGGetGWorld}                        
  8816.     kSGNewChannelSelect                                             = $6;             {SGNewChannel}
  8817.     kSGDisposeChannelSelect                                             = $7;             {SGDisposeChannel}
  8818.     kSGStartPreviewSelect                                             = $10;            {SGStartPreview}
  8819.     kSGStartRecordSelect                                             = $11;             {SGStartRecord}
  8820.     kSGIdleSelect                                             = $12;             {SGIdle}
  8821.     kSGStopSelect                                             = $13;             {SGStop}
  8822.     kSGPauseSelect                                             = $14;            {SGPause}
  8823.     kSGPrepareSelect                                             = $15;             {SGPrepare}
  8824.     kSGReleaseSelect                                             = $16;             {SGRelease}
  8825.     kSGGetMovieSelect                                             = $17;             {SGGetMovie}
  8826.     kSGSetMaximumRecordTimeSelect                                             = $18;             {SGSetMaximumRecordTime}
  8827.     kSGGetMaximumRecordTimeSelect                                             = $19;            {SGGetMaximumRecordTime}
  8828.     kSGGetStorageSpaceRemainingSelect                                            = $1A;            {SGGetStorageSpaceRemaining}                                            
  8829.     kSGGetTimeRemainingSelect                                             = $1B;             {SGGetTimeRemaining}                                    
  8830.     kSGGrabPictSelect                                             = $1C;             {SGGrabPict}
  8831.     kSGGetLastMovieResIDSelect                                             = $1D;             {SGGetLastMovieResID}
  8832.     kSGSetFlagsSelect                                             = $1E;             {SGSetFlags}
  8833.     kSGGetFlagsSelect                                             = $1F;             {SGGetFlags}
  8834.     kSGSetDataProcSelect                                            = $20;            {SGSetDataProc}
  8835.     kSGNewChannelFromComponentSelect                                            = $21;            {SGNewChannelFromComponent}
  8836.     kSGDisposeDeviceListSelect                                             = $22;            {SGDisposeDeviceList}
  8837.     kSGAppendDeviceListToMenuSelect                                             = $23;            {SGAppendDeviceListToMenu}
  8838.     kSGSetSettingsSelect                                             = $24;            {SGSetSettings}
  8839.     kSGGetSettingsSelect                                             = $25;            {SGGetSettings}
  8840.     kSGGetIndChannelSelect                                             = $26;            {SGGetIndChannel}
  8841.     kSGUpdateSelect                                             = $27;            {SGUpdate}
  8842.     kSGGetPauseSelect                                             = $28;            {SGGetPause}
  8843.     kSGSettingsDialogSelect                                             = $29;            {SGSettingsDialog}
  8844.     kSGGetAlignmentProcSelect                                             = $2A;            {SGGetAlignmentProc}
  8845.     kSGSetChannelSettingsSelect                                             = $2B;            {SGSetChannelSettings}
  8846.     kSGGetChannelSettingsSelect                                             = $2C;            {SGGetChannelSettings}
  8847.  
  8848.     {selectors for common channel configuration functions}
  8849.     kSGCSetChannelUsageSelect                                                     = $80;             {SGCSetChannelUsage}
  8850.     kSGCGetChannelUsageSelect                                                     = $81;             {SGCGetChannelUsage}
  8851.     kSGCSetChannelBoundsSelect                                                     = $82;             {SGCSetChannelBounds}
  8852.     kSGCGetChannelBoundsSelect                                                     = $83;             {SGCGetChannelBounds}
  8853.     kSGCSetChannelVolumeSelect                                                     = $84;             {SGCSetChannelVolume}
  8854.     kSGCGetChannelVolumeSelect                                                     = $85;             {SGCGetChannelVolume}
  8855.     kSGCGetChannelInfoSelect                                                     = $86;             {SGCGetChannelInfo}
  8856.     kSGCSetChannelPlayFlagsSelect                                                     = $87;             {SGCSetChannelPlayFlags}
  8857.     kSGCGetChannelPlayFlagsSelect                                                     = $88;             {SGCGetChannelPlayFlags}
  8858.     kSGCSetChannelMaxFramesSelect                                                     = $89;             {SGCSetChannelMaxFrames}
  8859.     kSGCGetChannelMaxFramesSelect                                                     = $8A;             {SGCGetChannelMaxFrames}
  8860.     kSGCSetChannelRefConSelect                                                     = $8B;             {SGCSetChannelRefCon}
  8861.     kSGCSetChannelClipSelect                                                     = $8C;            {SGCSetChannelClip}
  8862.     kSGCGetChannelClipSelect                                                     = $8D;            {SGCGetChannelClip}
  8863.     kSGCGetChannelSampleDescriptionSelect                                                    = $8E;         
  8864.                                                             {SGCGetChannelSampleDescription}
  8865.     kSGCGetChannelDeviceListSelect                                                     = $8F;            {SGCGetChannelDeviceList}
  8866.     kSGCSetChannelDeviceSelect                                                     = $90;            {SGCSetChannelDevice}
  8867.     kSGCSetChannelMatrixSelect                                                     = $91;            {SGCSetChannelMatrix}
  8868.     kSGCGetChannelMatrixSelect                                                     = $92;            {SGCGetChannelMatrix}
  8869.     kSGCGetChannelTimeScaleSelect                                                     = $93;            {SGCGetChannelTimeScale}
  8870.     
  8871.     {selectors for video channel configuration functions}
  8872.     kSGCGetSrcVideoBoundsSelect                                                     = $100;            {SGCGetSrcVideoBounds}
  8873.     kSGCSetVideoRectSelect                                                     = $101;            {SGCSetVideoRect}
  8874.     kSGCGetVideoRectSelect                                                     = $102;            {SGCGetVideoRect}
  8875.     kSGCGetVideoCompressorTypeSelect                                                     = $103;        
  8876.                                                         {SGCGetVideoCompressorType}
  8877.     kSGCSetVideoCompressorTypeSelect                                                     = $104;            
  8878.                                                         {SGCSetVideoCompressorType}
  8879.     kSGCSetVideoCompressorSelect                                                     = $105;            {SGCSetVideoCompressor}
  8880.     kSGCGetVideoCompressorSelect                                                     = $106;            {SGCGetVideoCompressor}
  8881.     kSGCGetVideoDigitizerComponentSelect                                                    = $107;
  8882.                                                         {SGCGetVideoDigitizerComponent}
  8883.     kSGCSetVideoDigitizerComponentSelect                                                     = $108; 
  8884.                                                         {SGCSetVideoDigitizerComponent}
  8885.     kSGCVideoDigitizerChangedSelect                                                     = $109;             {SGCVideoDigitizerChanged}
  8886.     kSGCSetVideoBottlenecksSelect                                                    = $10A;             {SGCSetVideoBottlenecks}
  8887.     kSGCGetVideoBottlenecksSelect                                                     = $10B;             {SGCGetVideoBottlenecks}
  8888.     kSGCGrabFrameSelect                                                     = $10C;             {SGCGrabFrame}
  8889.     kSGCGrabFrameCompleteSelect                                                     = $10D;             {SGCGrabFrameComplete}
  8890.     kSGCDisplayFrameSelect                                                     = $10E;            {SGCDisplayFrame}
  8891.     kSGCCompressFrameSelect                                                     = $10F;             {SGCCompressFrame}
  8892.     kSGCCompressFrameCompleteSelect                                                     = $110;             {SGCCompressFrameComplete}
  8893.     kSGCAddFrameSelect                                                     = $111;             {SGCAddFrame}
  8894.     kSGCTransferFrameForCompressSelect                                                     = $112;
  8895.                                                         {SGCTransferFrameForCompress}
  8896.     kSGCSetCompressBufferSelect                                                     = $113;            {SGCSetCompressBuffer}
  8897.     kSGCGetCompressBufferSelect                                                     = $114;            {SGCGetCompressBuffer}
  8898.     kSGCGetBufferInfoSelect                                                     = $115;             {SGCGetBufferInfo}
  8899.     kSGCSetUseScreenBufferSelect                                                     = $116;            {SGCSetUseScreenBuffer}
  8900.     kSGCGetUseScreenBufferSelect                                                     = $117;            {SGCGetUseScreenBuffer}
  8901.     kSGCGrabCompressCompleteSelect                                                     = $118;            {SGCGrabCompressComplete}
  8902.     kSGCDisplayCompressSelect                                                     = $119;            {SGCDisplayCompress}
  8903.     kSGCSetFrameRateSelect                                                     = $11A;            {SGCSetFrameRate}
  8904.     kSGCGetFrameRateSelect                                                     = $11B;            {SGCGetFrameRate}
  8905.     {selectors for sound channel configuration functions}
  8906.     kSGCSetSoundInputDriverSelect                                                 = $100;             {SGCSetSoundInputDriver}
  8907.     kSGCGetSoundInputDriverSelect                                                 = $101;             {SGCGetSoundInputDriver}
  8908.     kSGCSoundInputDriverChangedSelect                                                 = $102;            {SGCSoundInputDriverChanged}
  8909.     kSGCSetSoundRecordChunkSizeSelect                                                 = $103;            {SGCSetSoundRecordChunkSize}
  8910.     kSGCGetSoundRecordChunkSizeSelect                                                 = $104;             {SGCGetSoundRecordChunkSize}
  8911.     kSGCSetSoundInputRateSelect                                                 = $105;             {SGCSetSoundInputRate}
  8912.     kSGCGetSoundInputRateSelect                                                 = $106;             {SGCGetSoundInputRate}
  8913.     kSGCSetSoundInputParametersSelect                                                 = $107;            {SGCSetSoundInputParameters}
  8914.     kSGCGetSoundInputParametersSelect                                                 = $108;             {SGCGetSoundInputParameters}
  8915.     
  8916.     {selectors for utility functions provided to channel components}
  8917.     kSGWriteMovieDataSelect                                                 = $100;             {SGWriteMovieData}
  8918.     kSGAddFrameReferenceSelect                                                 = $101;             {SGAddFrameReference}
  8919.     kSGGetNextFrameReferenceSelect                                                 = $102;             {SGGetNextFrameReference}
  8920.     kSGGetTimeBaseSelect                                                 = $103;             {SGGetTimeBase}
  8921.     kSGSortDeviceListSelect                                                 = $104;            {SGSortDeviceList}
  8922.     kSGAddMovieDataSelect                                                 = $105;            {SGAddMovieData}
  8923.     kSGChangedSourceSelect                                                 = $106;            {SGChangedSource}
  8924. Data Types
  8925.  
  8926. TYPE SGCompressInfo = 
  8927.     PACKED RECORD
  8928.         buffer:                     Ptr;            {buffer containing compressed image}
  8929.         bufferSize:                     LongInt;            {bytes of image data in buffer}
  8930.         similarity:                     Char;            {relative similarity of image }
  8931.                                         { to previous image in sequence}
  8932.         reserved:                     Char;            {reserved}
  8933. END;
  8934.     VideoBottles = 
  8935.     RECORD
  8936.         procCount:                                 Integer;                            {number of callback }
  8937.                                                                     { routines in record}
  8938.         grabProc:                                 GrabProc;                            {grab function}
  8939.         grabCompleteProc:                                 GrabCompleteProc;                            {grab-complete function}
  8940.         displayProc:                                 DisplayProc;                            {display function}
  8941.         compressProc:                                 CompressProc;                            {compress function}
  8942.         compressCompleteProc:                                CompressCompleteProc;
  8943.                                                                     {compress-complete }
  8944.                                                                     { function}
  8945.         addFrameProc:                                 AddFrameProc;                            {add-frame function}
  8946.         transferFrameProc:                                TransferFrameProc;                            {transfer-frame }
  8947.                                                                     { function}
  8948.     END;
  8949.     SeqGrabFrameInfo = 
  8950.     RECORD
  8951.         frameOffset:                    LongInt;                    {offset to the sample}
  8952.         frameTime:                     LongInt;                    {time that frame was captured}
  8953.         frameSize:                    LongInt;                    {number of bytes in sample}
  8954.         frameChannel:                    SGChannel;                    {current connection to channel}
  8955.         frameRefCon:                    LongInt;                    {reference constant for channel}
  8956.     END;
  8957.     SGDeviceName = 
  8958.     RECORD
  8959.         name:            Str63;                {device name}
  8960.         icon    :         Handle;                {device icon}
  8961.         flags    :         LongInt;                {flags}
  8962.         refCon    :         LongInt;                {set to 0}
  8963.         reserved: LongInt;                            {reserved--set to 0}
  8964.     END;
  8965.     SGDeviceListPtr = ^SGDeviceListRecord;
  8966.     SGDeviceList = ^SGDeviceListPtr;
  8967.     SGDeviceListRecord = 
  8968.     RECORD
  8969.         count:                    Integer;                                        {count of devices}
  8970.         selectedIndex:                    Integer;                                        {current device}
  8971.         reserved:                    LongInt;                                        {reserved--set to 0}
  8972.         entry:                    ARRAY[0..0] OF SGDeviceName;                                        {device names}
  8973.     END;
  8974. Sequence Grabber Component Routines
  8975.  
  8976. Configuring Sequence Grabber Components
  8977. FUNCTION SGInitialize     (s: SeqGrabComponent): ComponentResult;
  8978. FUNCTION SGSetDataOutput     (s: SeqGrabComponent; movieFile: FSSpec; 
  8979. whereFlags: LongInt): ComponentResult;
  8980. FUNCTION SGGetDataOutput     (s: SeqGrabComponent; VAR movieFile: FSSpec; 
  8981. VAR whereFlags: LongInt): ComponentResult;
  8982. FUNCTION SGSetGWorld     (s: SeqGrabComponent; gp: CGrafPtr; 
  8983. gd: GDHandle): ComponentResult;
  8984. FUNCTION SGGetGWorld     (s: SeqGrabComponent; VAR gp: CGrafPtr; 
  8985. VAR gd: GDHandle): ComponentResult;
  8986. FUNCTION SGNewChannel     (s: SeqGrabComponent; channelType: OSType; 
  8987. VAR ref: SGChannel): ComponentResult;
  8988. FUNCTION SGNewChannelFromComponent 
  8989. (s: SeqGrabComponent; 
  8990. VAR newChannel: SGChannel; 
  8991. sgChannelComponent: Component): ComponentResult;
  8992. FUNCTION SGGetIndChannel     (s: SeqGrabComponent; index: Integer; 
  8993. VAR ref: SGChannel; 
  8994. VAR chanType: OSType): ComponentResult;
  8995. FUNCTION SGDisposeChannel     (s: SeqGrabComponent; 
  8996. c: SGChannel): ComponentResult;
  8997. FUNCTION SGSetDataProc     (s: SeqGrabComponent; proc: SGDataProc; 
  8998. refCon: LongInt): ComponentResult;
  8999. FUNCTION SGGetAlignmentProc
  9000. (s: SeqGrabComponent; 
  9001. alignmentProc: AlignmentProcRecordPtr): ComponentResult;
  9002. Controlling Sequence Grabber Components
  9003. FUNCTION SGStartPreview     (s: SeqGrabComponent): ComponentResult;
  9004. FUNCTION SGStartRecord     (s: SeqGrabComponent): ComponentResult;
  9005. FUNCTION SGIdle     (s: SeqGrabComponent): ComponentResult;
  9006. FUNCTION SGUpdate     (s: SeqGrabComponent; updateRgn: RgnHandle): ComponentResult;
  9007. FUNCTION SGStop     (s: SeqGrabComponent): ComponentResult;
  9008. FUNCTION SGPause     (s: SeqGrabComponent; 
  9009. paused: Byte): ComponentResult;
  9010. FUNCTION SGGetPause     (s: SeqGrabComponent; 
  9011. VAR paused: Byte): ComponentResult;
  9012. FUNCTION SGPrepare     (s: SeqGrabComponent; 
  9013. prepareForPreview: Boolean; 
  9014. prepareForRecord: Boolean): ComponentResult;
  9015. FUNCTION SGRelease     (s: SeqGrabComponent): ComponentResult;
  9016. FUNCTION SGGetMovie     (s: SeqGrabComponent): Movie;
  9017. FUNCTION SGGetLastMovieResID
  9018. (s: SeqGrabComponent; 
  9019. VAR resID: Integer): ComponentResult;
  9020. FUNCTION SGGrabPict     (s: SeqGrabComponent; VAR p: PicHandle; 
  9021. bounds: Rect; offscreenDepth: Integer; grabPictFlags: LongInt): ComponentResult;
  9022. Working With Sequence Grabber Settings
  9023. FUNCTION SGSettingsDialog     (s: SeqGrabComponent; c: SGChannel; 
  9024. numPanels: Integer; VAR panelList: Component; flags: LongInt; proc: SGModalFilterProcPtr; procRefNum: LongInt): ComponentResult;
  9025. FUNCTION SGGetSettings     (s: SeqGrabComponent; VAR ud: UserData; 
  9026. flags: LongInt): ComponentResult;
  9027. FUNCTION SGSetSettings     (s: SeqGrabComponent; ud: UserData; 
  9028. flags: LongInt): ComponentResult;
  9029. FUNCTION SGGetChannelSettings 
  9030. (s: SeqGrabComponent; c: SGChannel; 
  9031. VAR ud: UserData; flags: LongInt): ComponentResult;
  9032. FUNCTION SGSetChannelSettings
  9033. (s: SeqGrabComponent; c: SGChannel; 
  9034. ud: UserData; flags: LongInt): ComponentResult;
  9035. Working With Sequence Grabber Characteristics
  9036. FUNCTION SGSetMaximumRecordTime
  9037. (s: SeqGrabComponent; ticks: LongInt): ComponentResult;
  9038. FUNCTION SGGetMaximumRecordTime 
  9039. (s: SeqGrabComponent; VAR ticks: LongInt): ComponentResult;
  9040. FUNCTION SGGetStorageSpaceRemaining
  9041. (s: SeqGrabComponent; VAR bytes: LongInt): ComponentResult;
  9042. FUNCTION SGGetTimeRemaining    (s: SeqGrabComponent; VAR ticksLeft: LongInt): ComponentResult;
  9043. FUNCTION SGGetTimeBase     (s: SeqGrabComponent; VAR tb: TimeBase): ComponentResult;
  9044. FUNCTION SGSetFlags     (s: SeqGrabComponent; sgFlags: LongInt): ComponentResult;
  9045. FUNCTION SGGetFlags     (s: SeqGrabComponent; VAR sgFlags: LongInt): ComponentResult;
  9046. Working With Channel Characteristics
  9047. FUNCTION SGSetChannelUsage     (c: SGChannel; usage: LongInt): ComponentResult;
  9048. FUNCTION SGGetChannelUsage     (c: SGChannel; VAR usage: LongInt): ComponentResult;
  9049. FUNCTION SGGetChannelInfo     (c: SGChannel; VAR channelInfo: LongInt): ComponentResult;
  9050. FUNCTION SGSetChannelPlayFlags
  9051. (c: SGChannel; playFlags: LongInt): ComponentResult;
  9052. FUNCTION SGGetChannelPlayFlags
  9053. (c: SGChannel; VAR playFlags: LongInt): ComponentResult;
  9054. FUNCTION SGSetChannelMaxFrames 
  9055. (c: SGChannel; frameCount: LongInt): ComponentResult;
  9056. FUNCTION SGGetChannelMaxFrames 
  9057. (c: SGChannel; VAR frameCount: LongInt): ComponentResult;
  9058. FUNCTION SGSetChannelBounds     
  9059. (c: SGChannel; bounds: Rect): ComponentResult;
  9060. FUNCTION SGGetChannelBounds    
  9061. (c: SGChannel; VAR bounds: Rect): ComponentResult;
  9062. FUNCTION SGSetChannelVolume     
  9063. (c: SGChannel; volume: Integer): ComponentResult;
  9064. FUNCTION SGGetChannelVolume    
  9065. (c: SGChannel; VAR volume: Integer): ComponentResult;
  9066. FUNCTION SGSetChannelRefCon    
  9067. (c: SGChannel; refCon: LongInt): ComponentResult;
  9068. FUNCTION SGGetChannelSampleDescription 
  9069. (c: SGChannel; sampleDesc: Handle): ComponentResult;
  9070. FUNCTION SGGetChannelTimeScale
  9071. (c: SGChannel; VAR scale: TimeScale): ComponentResult;
  9072. FUNCTION SGGetChannelClip     (c: SGChannel; VAR theClip: RgnHandle): ComponentResult;
  9073. FUNCTION SGGetChannelClip     (c: SGChannel; VAR theClip: RgnHandle): ComponentResult;
  9074. FUNCTION SGGetChannelMatrix     
  9075. (c: SGChannel; VAR m: MatrixRecord): ComponentResult;
  9076. FUNCTION SGGetChannelMatrix     
  9077. (c: SGChannel; VAR m: MatrixRecord): ComponentResult;
  9078. Working With Channel Devices
  9079. FUNCTION SGGetChannelDeviceList    
  9080. (c: SGChannel; selectionFlags: LongInt; 
  9081. VAR list: SGDeviceList): ComponentResult;
  9082. FUNCTION SGDisposeDeviceList 
  9083. (s: SeqGrabComponent; list: SGDeviceList): ComponentResult;
  9084. FUNCTION SGAppendDeviceListToMenu 
  9085. (s: SeqGrabComponent; list: SGDeviceList; 
  9086. mh: MenuHandle): ComponentResult;
  9087. FUNCTION SGSetChannelDevice    (c: SGChannel; name: StringPtr): ComponentResult;
  9088. Working With Video Channels
  9089. FUNCTION SGGetSrcVideoBounds
  9090. (c: SGChannel; VAR r: Rect): ComponentResult;
  9091. FUNCTION SGSetVideoRect     (c: SGChannel; r: Rect): ComponentResult;
  9092. FUNCTION SGGetVideoRect     (c: SGChannel; VAR r: Rect): ComponentResult;
  9093. FUNCTION SGSetVideoCompressorType 
  9094. (c: SGChannel; compressorType: OSType): ComponentResult;
  9095. FUNCTION SGGetVideoCompressorType 
  9096. (c: SGChannel; VAR compressorType: OSType): ComponentResult;
  9097. FUNCTION SGSetVideoCompressor    
  9098. (c: SGChannel; depth: Integer; 
  9099. compressor: CompressorComponent; spatialQuality: CodecQ; 
  9100. temporalQuality: CodecQ; 
  9101. keyFrameRate: LongInt): ComponentResult;
  9102. FUNCTION SGGetVideoCompressor
  9103. (c: SGChannel; VAR depth: Integer; 
  9104. VAR compressor: CompressorComponent; 
  9105. VAR spatialQuality: CodecQ; 
  9106. VAR temporalQuality: CodecQ; 
  9107. VAR keyFrameRate: LongInt): ComponentResult;
  9108. FUNCTION SGSetVideoDigitizerComponent 
  9109. (c: SGChannel; vdig: ComponentInstance): ComponentResult;
  9110. FUNCTION SGGetVideoDigitizerComponent 
  9111. (c: SGChannel): ComponentInstance;
  9112. FUNCTION SGVideoDigitizerChanged 
  9113. (c: SGChannel): ComponentResult;
  9114. FUNCTION SGSetCompressBuffer
  9115. (c: SGChannel; depth: Integer; 
  9116. compressSize: Rect): ComponentResult;
  9117. FUNCTION SGGetCompressBuffer
  9118. (c: SGChannel; VAR depth: Integer; 
  9119. VAR compressSize: Rect): ComponentResult;
  9120. FUNCTION SGSetFrameRate     (c: SGChannel; 
  9121. frameRate: Fixed): ComponentResult;
  9122. FUNCTION SGGetFrameRate     (c: SGChannel; 
  9123. VAR frameRate: Fixed): ComponentResult;
  9124. FUNCTION SGSetUseScreenBuffer 
  9125. (c: SGChannel; useScreenBuffer: Boolean): ComponentResult;
  9126. FUNCTION SGGetUseScreenBuffer 
  9127. (c: SGChannel; VAR useScreenBuffer: Boolean): ComponentResult;
  9128. Working With Sound Channels
  9129. FUNCTION SGSetSoundInputDriver 
  9130. (c: SGChannel; driverName: Str255): ComponentResult;
  9131. FUNCTION SGGetSoundInputDriver 
  9132. (c: SGChannel): LongInt;
  9133. FUNCTION SGSoundInputDriverChanged 
  9134. (c: SGChannel): ComponentResult;
  9135. FUNCTION SGSetSoundRecordChunkSize 
  9136. (c: SGChannel; seconds: LongInt): ComponentResult;
  9137. FUNCTION SGGetSoundRecordChunkSize 
  9138. (c: SGChannel): LongInt;
  9139. FUNCTION SGSetSoundInputRate
  9140. (c: SGChannel; rate: Fixed): ComponentResult;
  9141. FUNCTION SGGetSoundInputRate
  9142. (c: SGChannel): Fixed; 
  9143. FUNCTION SGSetSoundInputParameters 
  9144. (c: SGChannel; sampleSize: Integer; numChannels: Integer; 
  9145. compressionType: OSType): ComponentResult;
  9146. FUNCTION SGGetSoundInputParameters 
  9147. (c: SGChannel; VAR sampleSize: Integer; 
  9148. VAR numChannels: Integer; 
  9149. VAR compressionType: OSType): ComponentResult;
  9150. Video Channel Callback Routines
  9151. FUNCTION SGSetVideoBottlenecks 
  9152. (c: SGChannel; VAR vb: VideoBottles): ComponentResult;
  9153. FUNCTION SGGetVideoBottlenecks 
  9154. (c: SGChannel; VAR vb: VideoBottles): ComponentResult;
  9155. Utility Routines for Video Channel Callback Functions
  9156. FUNCTION SGGetBufferInfo     (c: SGChannel; bufferNum: Integer; 
  9157. VAR bufferPM: PixMapHandle; 
  9158. VAR bufferRect: Rect; 
  9159. VAR compressBuffer: GWorldPtr; 
  9160. VAR compressBufferRect: Rect): ComponentResult;
  9161. FUNCTION SGGrabFrame     (c: SGChannel; bufferNum: Integer): ComponentResult;
  9162. FUNCTION SGGrabFrameComplete
  9163. (c: SGChannel; bufferNum: Integer; 
  9164. VAR done: Boolean): ComponentResult;
  9165. FUNCTION SGDisplayFrame     (c: SGChannel; bufferNum: Integer; 
  9166. mp: MatrixRecord; clipRgn: RgnHandle): ComponentResult;
  9167. FUNCTION SGCompressFrame     (c: SGChannel; bufferNum: Integer): ComponentResult;
  9168. FUNCTION SGCompressFrameComplete 
  9169. (c: SGChannel; bufferNum: Integer; 
  9170. VAR done: Boolean; VAR ci: SGCompressInfo): ComponentResult;
  9171. FUNCTION SGAddFrame     (c: SGChannel; bufferNum: Integer; 
  9172. atTime: TimeValue; scale: TimeScale; 
  9173. ci: SGCompressInfo): ComponentResult;
  9174. FUNCTION SGTransferFrameForCompress 
  9175. (c: SGChannel; bufferNum: Integer; 
  9176. mp: MatrixRecord; clipRgn: RgnHandle): ComponentResult;
  9177. FUNCTION SGGrabCompressComplete 
  9178. (c: SGChannel; VAR done: Boolean; 
  9179. VAR ci: SGCompressInfo; VAR tr: TimeRecord): ComponentResult; 
  9180. FUNCTION SGDisplayCompress     (c: SGChannel; dataPtr: Ptr; 
  9181. desc: ImageDescriptionHandle; 
  9182. VAR mp: MatrixRecord; 
  9183. clipRgn: RgnHandle): ComponentResult;
  9184. Application-Defined Routines
  9185.  
  9186. FUNCTION MyGrabFunction     (c: SGChannel; bufferNum: Integer; 
  9187. refCon: LongInt): ComponentResult;
  9188. FUNCTION MyGrabCompleteFunction 
  9189. (c: SGChannel; bufferNum: Integer; 
  9190. VAR done: Boolean; refCon: LongInt): ComponentResult;
  9191. FUNCTION MyDisplayFunction     (c: SGChannel; bufferNum: Integer; 
  9192. mp: MatrixRecord; clipRgn: RgnHandle; 
  9193. refCon: LongInt): ComponentResult;
  9194. FUNCTION MyCompressFunction     
  9195. (c: SGChannel; bufferNum: Integer; 
  9196. refCon: LongInt): ComponentResult;
  9197. FUNCTION MyCompressCompleteFunction 
  9198. (c: SGChannel; bufferNum: Integer; 
  9199. VAR done: Boolean; VAR ci: SGCompressInfo; refCon: LongInt): ComponentResult;
  9200. FUNCTION MyAddFrameFunction    
  9201. (c: SGChannel; bufferNum: Integer; 
  9202. atTime: TimeValue; scale: TimeScale; 
  9203. ci: SGCompressInfo; refCon: LongInt): ComponentResult;
  9204. FUNCTION MyTransferFrameFunction 
  9205. (c: SGChannel; bufferNum: Integer; 
  9206. mp: MatrixRecord; clipRgn: RgnHandle; 
  9207. refCon: LongInt): ComponentResult;
  9208. FUNCTION MyGrabCompressCompleteFunction
  9209. (c: SGChannel; VAR done: Boolean; 
  9210. VAR ci: SGCompressInfo; VAR tr: TimeRecord; refCon: LongInt): ComponentResult;
  9211. FUNCTION MyDisplayCompressFunction
  9212. (c: SGChannel; dataPtr; Ptr; 
  9213. desc: ImageDescriptionHandle; 
  9214. VAR mp: MatrixRecord; clipRgn: RgnHandle; refCon: LongInt): ComponentResult;
  9215. FUNCTION MyDataFunction    (c: SGChannel; p: Ptr; len: LongInt; 
  9216. VAR offset: LongInt; chRefCon: LongInt; 
  9217. time: TimeValue; writeType: Integer; 
  9218. refCon: LongInt): OSErr;
  9219. FUNCTION MyModalFilter    (theDialog: DialogPtr; 
  9220. VAR theEvent: EventRecord; 
  9221. VAR ItemHit: Integer; refCon: LongInt): OSErr;
  9222. Result CodesnoDeviceForChannel     –9400    Channel component cannot find its device    
  9223. grabTimeComplete    –9401    Time limit for record operation has expired    
  9224. cantDoThatInCurrentMode    –9402    Request invalid in current mode    
  9225. notEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  9226. notEnoughDiskSpaceToGrab    –9404    Insufficient disk space for record operation    
  9227. couldntGetRequiredComponent    –9405    Component not found    
  9228. badSGChannel    –9406    Invalid channel specified    
  9229. seqGrabInfoNotAvailable    –9407    Sequence grabber does not have this information at this time    
  9230. deviceCantMeetRequest    –9408    Device cannot support grabber    
  9231.  
  9232. Listing 6-0
  9233. Table 6-0
  9234. Sequence Grabber Channel Components
  9235. Contents
  9236. About Sequence Grabber Channel Components6-3
  9237. Creating Sequence Grabber Channel Components6-5
  9238. Component Type and Subtype Values6-6
  9239. Required Functions6-6
  9240. Component Manager Request Codes6-7
  9241. A Sample Sequence Grabber Channel Component6-10
  9242. Implementing the Required Component Functions6-10
  9243. Initializing the Sequence Grabber Channel Component6-15
  9244. Setting and Retrieving the Channel State6-16
  9245. Managing Spatial Properties6-17
  9246. Controlling Previewing and Recording Operations6-20
  9247. Managing Channel Devices6-24
  9248. Utility Functions for Recording Image Data6-24
  9249. Providing Media-Specific Functions6-28
  9250. Managing the Settings Dialog Box6-29
  9251. Displaying Channel Information in the Settings Dialog Box6-31
  9252. Using Sequence Grabber Channel Components6-33
  9253. Previewing6-33
  9254. Recording6-34
  9255. Working With Callback Functions6-35
  9256. Using Callback Functions for Video Channel Components6-35
  9257. Using Utility Functions for Video Channel Component Callback Functions 6-36
  9258. Sequence Grabber Channel Components Reference6-37
  9259. Functions6-37
  9260. Configuring Sequence Grabber Channel Components6-38
  9261. Controlling Sequence Grabber Channel Components6-39
  9262. Configuration Functions for All Channel Components6-46
  9263. Working With Channel Devices6-58
  9264. Configuration Functions for Video Channel Components6-61
  9265. Configuration Functions for Sound Channel Components6-77
  9266. Utility Functions for Sequence Grabber Channel Components6-84
  9267. Summary of Sequence Grabber Channel Components6-91
  9268. C Summary6-91
  9269. Constants6-91
  9270. Data Types6-94
  9271. Functions6-94
  9272. Pascal Summary6-99
  9273. Constants6-99
  9274. Data Types6-101
  9275. Routines6-102
  9276. Result Codes6-107
  9277. Sequence Grabber Channel Components
  9278. This chapter discusses sequence grabber channel components. Sequence grabber channel components manipulate captured data for sequence grabber components.
  9279. This chapter has been divided into the following sections:
  9280. n    “About Sequence Grabber Channel Components” presents general information about sequence grabber channel components and their relationship to sequence grabber components.
  9281. n    “Creating Sequence Grabber Channel Components” lists issues you should consider when developing a sequence grabber component, including required functions and the Component Manager result codes that you should use. It then provides a sample program that illustrates how to implement a sequence grabber channel component.
  9282. n    “Using Sequence Grabber Channel Components” gives details on how sequence grabber components can use channel components to play captured data for the user or to save captured data in a QuickTime movie.
  9283. n    “Sequence Grabber Channel Components Reference” describes the data structures and functions associated with the Apple-supplied sequence grabber channel component. 
  9284. n    “Summary of Sequence Grabber Channel Components” presents a summary of sequence grabber channel components in C and in Pascal.
  9285. If you are writing an application that uses the sequence grabber component, you do not need to read this chapter. Read the chapter “Sequence Grabber Components” in this book for a description of the services provided by sequence grabber components. If you are writing a sequence grabber channel component, you should read this chapter and read the earlier chapter that discusses sequence grabber components. 
  9286. Note
  9287. Information in this chapter is presented from the perspective of 
  9288. a developer of a sequence grabber channel component. If you are developing a sequence grabber channel component, your component must support the interfaces described in this chapter.u
  9289.  
  9290. About Sequence Grabber Channel Components
  9291.  
  9292. Sequence grabber components allow applications to obtain digitized data from sources that are external to a Macintosh computer. For example, applications can use a sequence grabber component to record video data from a video digitizer or a video disc player. The application can then request that the sequence grabber component store the captured video data in a QuickTime movie. In this manner users can acquire movie data from various sources. Applications can also use sequence grabber components to obtain and display data from external sources, without saving the captured data in a movie. For more information about sequence grabbers, see the chapter “Sequence Grabber Components” in this book.
  9293. Sequence grabber components use sequence grabber channel components (or, simply, channel components) to obtain data from audio- or video-digitizing equipment. These components isolate the sequence grabber component from the details of working with the various types of data that can be collected. The functionality provided by a sequence grabber component depends upon the services provided by sequence grabber channel components. The channel components, in turn, may use other components to interact with the digitizing equipment. For example, the video channel component supplied by Apple uses a video digitizer component. Figure 6-1 shows the relationship between these components and an application. 
  9294. Figure 6-1    Relationships of an application, a sequence grabber component, and channel components
  9295.  
  9296. Sequence grabber panel components augment the capabilities of sequence grabber components and sequence grabber channel components by allowing sequence grabbers to obtain configuration information from the user for a particular digitizing source. Sequence grabbers present a settings dialog box to the user whenever an application calls the SGSettingsDialog function (see the chapter “Sequence Grabber Components” for more information about this sequence grabber function). Applications never call sequence grabber panel components directly; application developers use panel components only by calling the sequence grabber component. 
  9297. Note that sequence grabber channel components may support all of the functions that are supported by sequence grabber panel components. For example, sequence grabbers obtain settings information from a channel component by calling the channel component’s SGPanelGetSettings function. See the chapter “Sequence Grabber Panel Components” in this book for more information about the sequence grabber configuration dialog box; the relationship between sequence grabbers, sequence grabber channels, and sequence grabber panels; and the functional interface supported by sequence grabber panel components.
  9298. If you are developing digitizing equipment and you want to allow applications to use the services of your equipment with a sequence grabber component, you should create an appropriate video digitizer component or sound input device driver. See the chapter “Video Digitizer Components” in this book for a description of video digitizer components. See Inside Macintosh: More Macintosh Toolbox for information about sound input device drivers. 
  9299. If you are developing equipment that provides a new type of data to QuickTime, you should develop a new sequence grabber channel component. See the next section, “Creating Sequence Grabber Channel Components,” for more information about creating sequence grabber channel components. 
  9300.  
  9301. Creating Sequence Grabber Channel Components
  9302.  
  9303. Sequence grabber channel components are the most convenient mechanism for extending the ability of the sequence grabber component to accommodate new types of source data. For example, if you are developing special-purpose hardware that generates a new kind of data, you should create a channel component for that kind of data.
  9304. Refer to the chapter “Component Manager” in Inside Macintosh: More Macintosh Toolbox for a general discussion of how to create a component.
  9305. This section discusses issues you should consider when creating a sequence grabber channel component. It also provides a sample program for the implementation of a sequence grabber channel component.
  9306. Component Type and Subtype Values
  9307.  
  9308. Apple has defined a component type value for sequence grabber channel 
  9309. components—that type value is 'sgch'. You can use the following constant to specify this type value:
  9310. #define SeqGrabChannelType 'sgch';
  9311. Sequence grabber channel components use their component subtype value to indicate the media type created by the component. For example, a channel component that works with video data would have a subtype of 'vide' (this value is defined by the Movie Toolbox’s VideoMediaType constant). 
  9312. Required Functions
  9313.  
  9314. At a minimum, your channel component should support the following functions:SGGetChannelInfo    SGRelease    
  9315. SGGetChannelUsage    SGSetChannelRefCon    
  9316. SGGetDataRate    SGSetChannelUsage    
  9317. SGIdle    SGStartPreview    
  9318. SGInitChannel    SGStartRecord    
  9319. SGPause    SGStop    
  9320. SGPrepare    SGWriteSamples    
  9321.  
  9322. In addition, if your channel component supports visual data, it should support at least the following functions:
  9323. SGGetChannelBounds
  9324. SGSetChannelBounds
  9325. SGSetGWorld
  9326. If your channel component supports audio data, it should support the following functions as well:
  9327. SGGetChannelVolume
  9328. SGSetChannelVolume
  9329. The remaining functions described in this section are optional. However, your 
  9330. channel component should support as many of these functions as possible, so that your component is more useful to applications and users.
  9331. Component Manager Request Codes
  9332.  
  9333. As with all components, your channel component receives its requests from the Component Manager in the form of request codes. Apple strongly recommends that you fully support all of the Component Manager’s request codes in your channel component—especially the target request. Developers will want to extend the capabilities of the sequence grabber channel components. The Component Manager’s CaptureComponent function, which uses the target request, is the most convenient mechanism for obtaining the services of a component and then extending those services. If your channel component does not support the target request, then it cannot be used by applications or other components in this manner. You can use the following constants to refer to the request codes for each of the functions that your channel component must support.
  9334.     /*  basic sequence grabber channel component selectors */
  9335.     kSGSetGWorldSelect                                         = 0x4;            /* SetGWorld */                     
  9336.     kSGStartPreviewSelect                                         = 0x10;             /* SGStartPreview */ 
  9337.     kSGStartRecordSelect                                         = 0x11;             /* SGStartRecord */ 
  9338.     kSGIdleSelect                                         = 0x12;             /* SGIdle */ 
  9339.     kSGStopSelect                                         = 0x13;             /* SGStop */ 
  9340.     kSGPauseSelect                                         = 0x14;             /* SGPause */ 
  9341.     kSGPrepareSelect                                         = 0x15;             /* SGPrepare */ 
  9342.     kSGReleaseSelect                                         = 0x16;             /* SGRelease */ 
  9343.     kSGUpdateSelect                                         = 0x27;            /* SGUpdate */
  9344.  
  9345.     /*  selectors for common channel configuration functions */
  9346.     kSGCSetChannelUsageSelect                                         = 0x80; /* SGCSetChannelUsage */ 
  9347.     kSGCGetChannelUsageSelect                                         = 0x81; /* SGCGetChannelUsage */ 
  9348.     kSGCSetChannelBoundsSelect                                         = 0x82; /* SGCSetChannelBounds */ 
  9349.     kSGCGetChannelBoundsSelect                                         = 0x83; /* SGCGetChannelBounds */ 
  9350.     kSGCSetChannelVolumeSelect                                         = 0x84; /* SGCSetChannelVolume */ 
  9351.     kSGCGetChannelVolumeSelect                                         = 0x85; /* SGCGetChannelVolume */ 
  9352.     kSGCGetChannelInfoSelect                                         = 0x86;         /* SGCGetChannelInfo */
  9353.     kSGCSetChannelPlayFlagsSelect                                         = 0x87;         /* SGCSetChannelPlayFlags */
  9354.     kSGCGetChannelPlayFlagsSelect                                         = 0x88; /* SGCGetChannelPlayFlags */ 
  9355.     kSGCSetChannelMaxFramesSelect                                         = 0x89;         /* SGCSetChannelMaxFrames */ 
  9356.     kSGCGetChannelMaxFramesSelect                                         = 0x8a;         /* SGCGetChannelMaxFrames */ 
  9357.     kSGCSetChannelRefConSelect                                         = 0x8b;         /* SGCSetChannelRefCon */ 
  9358.     kSGCSetChannelClipSelect                                         = 0x8C;         /* SGCSetChannelClip */
  9359.     kSGCGetChannelClipSelect                                         = 0x8D;         /* SGCGetChannelClip */
  9360.     kSGCGetChannelSampleDescriptionSelect = 0x8E;
  9361.                                                     /* SGCGetChannelSampleDescription */
  9362.     kSGCGetChannelDeviceListSelect                                             = 0x8F;            /* SGCGetChannelDeviceList */
  9363.     kSGCSetChannelDeviceSelect                                             = 0x90;            /* SGCSetChannelDevice */
  9364.     kSGCSetChannelMatrixSelect                                             = 0x91;            /* SGCSetChannelMatrix */
  9365.     kSGCGetChannelMatrixSelect                                             = 0x92;            /* SGCGetChannelMatrix */
  9366.     kSGCGetChannelTimeScaleSelect                                             = 0x93;            /* SGCGetChannelTimeScale */
  9367.     /*  selectors for video channel configuration functions */
  9368.     kSGCGetSrcVideoBoundsSelect                                                 = 0x100;            /* SGCGetSrcVideoBounds */ 
  9369.     kSGCSetVideoRectSelect                                                 = 0x101;            /* SGCSetVideoRect */ 
  9370.     kSGCGetVideoRectSelect                                                 = 0x102;            /* SGCGetVideoRect */ 
  9371.     kSGCGetVideoCompressorTypeSelect                                                 = 0x103;
  9372.                                                     /* SGCGetVideoCompressorType */ 
  9373.  
  9374.     kSGCSetVideoCompressorTypeSelect                                                 = 0x104;
  9375.                                                     /* SGCSetVideoCompressorType */ 
  9376.     kSGCSetVideoCompressorSelect                                                 = 0x105;            /* SGCSetVideoCompressor */ 
  9377.     kSGCGetVideoCompressorSelect                                                 = 0x106        ;    /* SGCGetVideoCompressor */ 
  9378.     kSGCGetVideoDigitizerComponentSelect                                                = 0x107; 
  9379.                                                     /* SGCGetVideoDigitizerComponent */ 
  9380.     kSGCSetVideoDigitizerComponentSelect                        = 0x108; 
  9381.                                                     /* SGCSetVideoDigitizerComponent */ 
  9382.     kSGCVideoDigitizerChangedSelect                                                 = 0x109;
  9383.                                                     /* SGCVideoDigitizerChanged */ 
  9384.     kSGCSetVideoBottlenecksSelect                                                = 0x10a; 
  9385.                                                     /* SGCSetVideoBottlenecks */
  9386.     kSGCGetVideoBottlenecksSelect                                                 = 0x10b; 
  9387.                                                     /* SGCGetVideoBottlenecks */ 
  9388.     kSGCGrabFrameSelect                                                 = 0x10c;            /* SGCGrabFrame */ 
  9389.     kSGCGrabFrameCompleteSelect                                                 = 0x10d;        
  9390.                                                     /* SGCGrabFrameComplete */ 
  9391.     kSGCDisplayFrameSelect                                                 = 0x10e;            /* SGCDisplayFrame */ 
  9392.     kSGCCompressFrameSelect                                                 = 0x10f;             /* SGCCompressFrame */ 
  9393.     kSGCCompressFrameCompleteSelect                                                 = 0x110;
  9394.                                                             /* SGCCompressFrameComplete */ 
  9395.     kSGCAddFrameSelect                                                 = 0x111; /* SGCAddFrame */ 
  9396.     kSGCTransferFrameForCompressSelect                                                 = 0x112;
  9397.                                                         /* SGCTransferFrameForCompress */ 
  9398.     kSGCSetCompressBufferSelect                                                 = 0x113;             /* SGCSetCompressBuffer */ 
  9399.     kSGCGetCompressBufferSelect                                                 = 0x114;             /* SGCGetCompressBuffer */ 
  9400.     kSGCGetBufferInfoSelect                                                 = 0x115;              /* SGCGetBufferInfo */ 
  9401.     kSGCSetUseScreenBufferSelect                                                 = 0x116;              /* SGCSetUseScreenBuffer */
  9402.     kSGCGetUseScreenBufferSelect                                                 = 0x117;              /* SGCGetUseScreenBuffer */
  9403.     kSGCGrabCompressCompleteSelect                                                 = 0x118;              
  9404.                                                     /* SGCGrabCompressComplete */
  9405.     kSGCDisplayCompressSelect                                                 = 0x119; /* SGCDisplayCompress */
  9406.     kSGCSetFrameRateSelect                                                 = 0x11A; /* SGCSetFrameRate */
  9407.     kSGCGetFrameRateSelect                                                 = 0x11B; /* SGCGetFrameRate */     
  9408.     /*  selectors for sound channel configuration functions */
  9409.     kSGCSetSoundInputDriverSelect                                             = 0x100; /* SGCSetSoundInputDriver */ 
  9410.     kSGCGetSoundInputDriverSelect                                             = 0x101; /* SGCGetSoundInputDriver */ 
  9411.     kSGCSoundInputDriverChangedSelect                                            
  9412.                                                 = 0x102;            /* SGCSoundInputDriverChanged */ 
  9413.     kSGCSetSoundRecordChunkSizeSelect     
  9414.                                                 = 0x103;
  9415.                                                         /* SGCSetSoundRecordChunkSize */ 
  9416.     kSGCGetSoundRecordChunkSizeSelect                                                = 0x104; 
  9417.                                                         /* SGCGetSoundRecordChunkSize */ 
  9418.     kSGCSetSoundInputRateSelect                                                  = 0x105; /* SGCSetSoundInputRate */ 
  9419.     kSGCGetSoundInputRateSelect                                                  = 0x106; /* SGCGetSoundInputRate */         
  9420.     kSGCSetSoundInputParametersSelect                                                 = 0x107; 
  9421.                                                         /* SGCSetSoundInputParameters */
  9422.     kSGCGetSoundInputParametersSelect                                                 = 0x108;
  9423.                                                         /* SGCGetSoundInputParameters */
  9424.     /*  selectors for channel control functions */
  9425.     kSGCInitChannelSelect                                                 = 0x180; /* SGCInitChannel */ 
  9426.     kSGCWriteSamplesSelect                                                 = 0x181; /* SGCWriteSamples */ 
  9427.     kSGCGetDataRateSelect                                                 = 0x182; /* SGCDataRate */
  9428.     kSGCAlignChannelRectSelect                                                 = 0x183;            /* SGAlignChannelRect */
  9429. }; 
  9430. A Sample Sequence Grabber Channel Component
  9431.  
  9432. This section describes a sample sequence grabber channel component for PICT image data. 
  9433. Implementing the Required Component Functions
  9434.  
  9435. Listing 6-1 supplies the component dispatchers for the sequence grabber channel component together with the required functions.
  9436. Listing 6-1    Setting up global variables and implementing required functions
  9437.  
  9438. #define kMediaTimeScale 600
  9439. typedef struct {
  9440.     ComponentInstance                        self;
  9441.     SeqGrabComponent                        grabber;
  9442.     long                        usage;
  9443.     Boolean                        paused;
  9444.     CGrafPtr                        destPort;
  9445.     GDHandle                        destGD;
  9446.     CGrafPort                        tempPort;
  9447.     MatrixRecord                        displayMatrix;
  9448.     Rect                        destRect;
  9449.     Rect                        srcRect;
  9450.     RgnHandle                        clip;
  9451.     Boolean                        inPreview;
  9452.     Boolean                        inRecord;
  9453.     TimeBase                        base;
  9454.     long                        bytesWritten;
  9455.     Boolean                        showTickCount;
  9456.     long                        saveUsage;
  9457. } SGPictGlobalsRecord, *SGPictGlobals;
  9458. pascal ComponentResult SGPICTDispatcher
  9459.                             (ComponentParameters *params, Handle storage)
  9460. {
  9461.     OSErr err = badComponentSelector;
  9462.     ComponentFunction componentProc = 0;
  9463.     switch (params->what) {
  9464.         case kComponentOpenSelect: 
  9465.                 componentProc = SGPictOpen; break;
  9466.         case kComponentCloseSelect: 
  9467.                 componentProc = SGPictClose; break;
  9468.         case kComponentCanDoSelect: 
  9469.                 componentProc = SGPictCanDo; break;
  9470.         case kComponentVersionSelect: 
  9471.                 componentProc = SGPictVersion; break;
  9472.         case kSGSetGWorldSelect: 
  9473.                 componentProc = SGPictSetGWorld; break;
  9474.         case kSGStartPreviewSelect: 
  9475.                 componentProc = SGPictStartPreview; break;
  9476.         case kSGStartRecordSelect: 
  9477.                 componentProc = SGPictStartRecord; break;
  9478.         case kSGIdleSelect: 
  9479.                 componentProc = SGPictIdle; break;
  9480.         case kSGStopSelect: 
  9481.                 componentProc = SGPictStop; break;
  9482.         case kSGPauseSelect: 
  9483.                 componentProc = SGPictPause; break;
  9484.         case kSGPrepareSelect: 
  9485.                 componentProc = SGPictPrepare; break;
  9486.         case kSGReleaseSelect: 
  9487.                 componentProc = SGPictRelease; break;
  9488.         case kSGCSetChannelUsageSelect: 
  9489.                 componentProc = SGPictSetChannelUsage; break;
  9490.         case kSGCGetChannelUsageSelect: 
  9491.                 componentProc = SGPictGetChannelUsage; break;
  9492.         case kSGCSetChannelBoundsSelect: 
  9493.                 componentProc = SGPictSetChannelBounds; break;
  9494.         case kSGCGetChannelBoundsSelect: 
  9495.                 componentProc = SGPictGetChannelBounds; break;
  9496.         case kSGCGetChannelInfoSelect: 
  9497.                 componentProc = SGPictGetChannelInfo; break;
  9498.         case kSGCSetChannelMatrixSelect: 
  9499.                 componentProc = SGPictSetChannelMatrix; break;
  9500.         case kSGCGetChannelMatrixSelect: 
  9501.                 componentProc = SGPictGetChannelMatrix; break;
  9502.         case kSGCSetChannelClipSelect: 
  9503.                 componentProc = SGPictSetChannelClip; break;
  9504.         case kSGCGetChannelClipSelect: 
  9505.                 componentProc = SGPictGetChannelClip; break;
  9506.         case kSGCGetChannelSampleDescriptionSelect: 
  9507.                 componentProc = SGPictGetChannelSampleDescription;
  9508.                  break;
  9509.         case kSGCGetChannelDeviceListSelect: 
  9510.             componentProc = SGPictGetChannelDeviceList; break;
  9511.         case kSGCSetChannelDeviceSelect: 
  9512.             componentProc = SGPictSetChannelDevice; break;
  9513.         case kSGCGetChannelTimeScaleSelect: 
  9514.             componentProc = SGPictGetChannelTimeScale; break;
  9515.         case kSGCInitChannelSelect: 
  9516.             componentProc = SGPictInitChannel; break;
  9517.         case kSGCWriteSamplesSelect: 
  9518.             componentProc = SGPictWriteSamples; break;
  9519.         case kSGCGetDataRateSelect: 
  9520.                 componentProc = SGPictGetDataRate; break;
  9521.         case kSGCPanelGetDitlSelect: 
  9522.                 componentProc = SGPictPanelGetDitl; break;
  9523.         case kSGCPanelInstallSelect: 
  9524.                 componentProc = SGPictPanelInstall; break;
  9525.         case kSGCPanelEventSelect: 
  9526.                 componentProc = SGPictPanelEvent; break;
  9527.         case kSGCPanelRemoveSelect: 
  9528.                 componentProc = SGPictPanelRemove; break;
  9529.         case kSGCPanelGetSettingsSelect: 
  9530.                 componentProc = SGPictPanelGetSettings; break;
  9531.         case kSGCPanelSetSettingsSelect: 
  9532.                 componentProc = SGPictPanelSetSettings; break;
  9533.         case 0x0100: 
  9534.                 componentProc = SGPictSetShowTickCount; break;
  9535.         case 0x0101: 
  9536.                 componentProc = SGPictGetShowTickCount; break;
  9537.     }
  9538.     if (componentProc)
  9539.         err = CallComponentFunctionWithStorage (storage, params,
  9540.                                                              componentProc);
  9541.     return err;
  9542. }
  9543. pascal ComponentResult SGPictCanDo (SGPictGlobals store, 
  9544.                                                 short ftnNumber)
  9545. {
  9546.     switch (ftnNumber) {
  9547.         case kComponentOpenSelect:
  9548.         case kComponentCloseSelect:
  9549.         case kComponentCanDoSelect:
  9550.         case kComponentVersionSelect:
  9551.         case kSGSetGWorldSelect: 
  9552.         case kSGStartPreviewSelect:
  9553.         case kSGStartRecordSelect: 
  9554.         case kSGIdleSelect: 
  9555.         case kSGStopSelect: 
  9556.         case kSGPauseSelect: 
  9557.         case kSGPrepareSelect: 
  9558.         case kSGReleaseSelect: 
  9559.         case kSGCSetChannelUsageSelect: 
  9560.         case kSGCGetChannelUsageSelect: 
  9561.         case kSGCSetChannelBoundsSelect: 
  9562.         case kSGCGetChannelBoundsSelect: 
  9563.         case kSGCGetChannelInfoSelect: 
  9564.         case kSGCSetChannelMatrixSelect: 
  9565.         case kSGCGetChannelMatrixSelect: 
  9566.         case kSGCSetChannelClipSelect: 
  9567.         case kSGCGetChannelClipSelect: 
  9568.         case kSGCGetChannelSampleDescriptionSelect: 
  9569.         case kSGCGetChannelDeviceListSelect: 
  9570.         case kSGCSetChannelDeviceSelect: 
  9571.         case kSGCGetChannelTimeScaleSelect: 
  9572.         case kSGCInitChannelSelect: 
  9573.         case kSGCWriteSamplesSelect: 
  9574.         case kSGCGetDataRateSelect: 
  9575.         case kSGCPanelGetDitlSelect: 
  9576.         case kSGCPanelInstallSelect: 
  9577.         case kSGCPanelEventSelect: 
  9578.         case kSGCPanelRemoveSelect: 
  9579.         case kSGCPanelGetSettingsSelect: 
  9580.         case kSGCPanelSetSettingsSelect: 
  9581.         /* private component functions */
  9582.         case 0x0100: 
  9583.         case 0x0101: 
  9584.             return true;
  9585.         default:
  9586.             return false;
  9587.     }
  9588. }
  9589. pascal ComponentResult SGPictVersion (SGPictGlobals store)
  9590. {
  9591.     return 0x00020001;
  9592. }
  9593. pascal ComponentResult SGPictOpen (SGPictGlobals store,
  9594.                                              ComponentInstance self)
  9595. {
  9596.     OSErr err;
  9597.     GrafPtr savePort;
  9598.     /* allocate global variables */
  9599.     store =
  9600.     (SGPictGlobals)NewPtrClear(sizeof(SGPictGlobalsRecord));
  9601.     if (err = MemError()) goto bail;
  9602.     /* create a temporary port for drawing during the idle 
  9603.         function */
  9604.     GetPort (&savePort);
  9605.     OpenCPort (&store->tempPort);
  9606.     SetPort ((GrafPtr)&store->tempPort);
  9607.     PortSize (4096, 4096);
  9608.     SetRectRgn (store->tempPort.visRgn, 0, 0, 4096, 4096);
  9609.     ClipRgn (store->tempPort.visRgn);
  9610.     SetPort (savePort);
  9611.     store->self = self;
  9612.     store->showTickCount = false;
  9613.     SetComponentInstanceStorage (self, (Handle)store);
  9614. bail:
  9615.     return err;
  9616. }
  9617. pascal ComponentResult SGPictClose (SGPictGlobals store,
  9618.                                              ComponentInstance self)
  9619. {
  9620.     /* disposal operations */
  9621.     if (store) {
  9622.         if (store->clip) DisposeRgn(store->clip);
  9623.         CloseCPort(&store->tempPort);
  9624.         DisposPtr((Ptr)store);
  9625.     }
  9626.     return noErr;
  9627. }
  9628. Initializing the Sequence Grabber Channel Component
  9629.  
  9630. To initialize the channel component, the sequence grabber component calls the SGInitChannel function, which is described on page 6-38. 
  9631. The code in Listing 6-2 initializes channel variables. The grabber component calls the SGPictInitChannel function to initialize a sequence grabber channel component. 
  9632. The SGPictInitChannel function calls QuickDraw’s SetRect routine and QuickTime’s SetIdentityMatrix function to specify the size of the area (around a mouse-down event) in which the sequence grabber component will capture PICT images. For more on the SetRect routine, see the chapter “Basic QuickDraw” in Inside Macintosh: Imaging. For details on the SetIdentityMatrix function, see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime.
  9633. Listing 6-2    Initializing the sequence grabber channel component
  9634.  
  9635. pascal ComponentResult SGPictInitChannel (SGPictGlobals store,
  9636.                                                      SeqGrabComponent owner)
  9637. {
  9638.  
  9639.     /* initialize any variables here */
  9640.     SetRect(&store->srcRect, 0, 0, 160, 120);/* rectangle in which
  9641.                                                              capture occurs */
  9642.     SetIdentityMatrix (&store->displayMatrix);
  9643.     store->grabber = owner;
  9644.     SGGetTimeBase (owner, &store->base);
  9645.     return noErr;
  9646. }
  9647. Setting and Retrieving the Channel State
  9648.  
  9649. Listing 6-3 supplies configuration functions that set the usage parameters and storage for the channel component. (See the descriptions of the SGSetChannelUsage and SGGetChannelUsage functions on page 6-48 and page 6-49, respectively, for details.) 
  9650. The sample code illustrates how to retrieve usage information. (See the description of the SGGetChannelInfo function on page 6-49 for details.) In this case, you indicate that the sequence grabber component has spatial boundaries by using the seqGrabHasBounds constant in the channelInfo parameter.
  9651. Listing 6-3    Determining usage parameters and getting usage data
  9652.  
  9653. pascal ComponentResult SGPictSetChannelUsage(SGPictGlobals store,
  9654.                                                              long usage)
  9655. {
  9656.     /* remember usage */
  9657.     store->usage = usage;
  9658.     return noErr;
  9659. }
  9660. pascal ComponentResult SGPictGetChannelUsage(SGPictGlobals store,
  9661.                                                             long *usage)
  9662. {
  9663.     /* return usage */
  9664.     *usage = store->usage;
  9665.     return noErr;
  9666. }
  9667. pascal ComponentResult SGPictGetChannelInfo (SGPictGlobals store,
  9668.                                                              long *channelInfo)
  9669. {
  9670.     /* indicate that you have spatial boundaries */
  9671.     *channelInfo = seqGrabHasBounds;
  9672.     return noErr;
  9673. }
  9674. Managing Spatial Properties
  9675.  
  9676. To set up an area in which the channel component displays image data, the sequence grabber should perform these tasks:
  9677. n    Assign the destination graphics world and graphics device for the display of the captured image with the SGSetGWorld function (described on page 6-39).
  9678. n    Specify a display transformation matrix for a video channel using the SGSetChannelMatrix function, which is described on page 6-57. Your function determines the matrix that is being set, validates it, and updates the matrix and destination rectangle. Your channel uses this matrix to transform its video image into the destination window. 
  9679. n    Obtain the channel’s display transformation matrix by calling the SGGetChannelMatrix function, which is described on page 6-58.
  9680. n    Specify the channel’s display boundary rectangle with the SGSetChannelBounds function, which is described on page 6-63. The display boundary rectangle defines the destination for data from this channel and adjusts the channel matrix.
  9681. n    Determine the channel’s display boundary rectangle with the SGGetChannelBounds function (described on page 6-63).
  9682. n    Dispose of the old clipping region and apply a new clipping region to the channel’s display region using the SGSetChannelClip function, which is described on page 6-56.
  9683. n    Retrieve the new clipping region by calling the SGGetChannelClip function (described on page 6-56).
  9684. The code in Listing 6-4 provides an example of how to manage the spatial characteristics of the area in which the channel component displays PICT image data.
  9685. Listing 6-4    Managing spatial characteristics
  9686.  
  9687. pascal ComponentResult SGPictSetGWorld (SGPictGlobals store,
  9688.                                                      CGrafPtr gp, GDHandle gd)
  9689. {
  9690.     /* remember the destination graphics world */
  9691.     store->destPort = gp;
  9692.     store->destGD = gd;
  9693.     return noErr;
  9694. }
  9695. pascal ComponentResult SGPictSetChannelMatrix 
  9696.                             (SGPictGlobals store, const MatrixRecord *m)
  9697. {
  9698.     OSErr err = noErr;
  9699.     MatrixRecord mat;
  9700.     short matType;
  9701.     /* determine the matrix being set */
  9702.     if (m)
  9703.         mat = *m;
  9704.     else
  9705.         SetIdentityMatrix (&mat);
  9706.     /* validate it */
  9707.     matType = GetMatrixType (&mat);
  9708.     if ((mat.matrix[0][0] < 0) || (mat.matrix[1][1] < 0) ||
  9709.     (matType >= linearMatrixType))
  9710.         return paramErr;
  9711.     /* update the matrix and destination rectangle */
  9712.     store->displayMatrix = mat;
  9713.     store->destRect = store->srcRect;
  9714.     TransformRect (&mat, &store->destRect, nil);
  9715.     return err;
  9716. }
  9717. pascal ComponentResult SGPictGetChannelMatrix 
  9718.                                 (SGPictGlobals store, MatrixRecord *m)
  9719. {
  9720.     /* return current matrix */
  9721.     *m = store->displayMatrix;
  9722.     return noErr;
  9723. }
  9724. pascal ComponentResult SGPictSetChannelBounds 
  9725.                                 (SGPictGlobals store, const Rect *bounds)
  9726. {
  9727.     /* remember destination rect */
  9728.     store->destRect = *bounds;
  9729.     /* recalculate display matrix from it */
  9730.     RectMatrix (&store->displayMatrix, &store->srcRect,
  9731.                      &store->destRect);
  9732.     return noErr;
  9733. }
  9734. pascal ComponentResult SGPictGetChannelBounds 
  9735.                                         (SGPictGlobals store, Rect *bounds)
  9736. {
  9737.     /* return current boundaries */
  9738.     *bounds = store->destRect;
  9739.     return noErr;
  9740. }
  9741. pascal ComponentResult SGPictSetChannelClip (SGPictGlobals store,
  9742.                                                          RgnHandle theClip)
  9743. {
  9744.     OSErr err = noErr;
  9745.     /* toss the old channel clipping */
  9746.     if (store->clip) {
  9747.         DisposeRgn (store->clip);
  9748.         store->clip = nil;
  9749.     }
  9750.     /* and remember the new one */
  9751.     if (theClip) {
  9752.         err = HandToHand ((Handle *)&theClip);
  9753.         store->clip = theClip;
  9754.     }
  9755.     return err;
  9756. }
  9757. pascal ComponentResult SGPictGetChannelClip 
  9758.                                 (SGPictGlobals store, RgnHandle *theClip)
  9759. {
  9760.     OSErr err = noErr;
  9761.     /* return clip, if there is one */
  9762.     if (*theClip = store->clip)
  9763.         err = HandToHand ((Handle *)theClip);
  9764.     return err;
  9765. }
  9766. Controlling Previewing and Recording Operations
  9767.  
  9768. To preview and record image data in the channel component, the code in Listing 6-5 implements these tasks:
  9769. n    The SGStartPreview function (described on page 6-40) instructs the channel to commence processing any source data. In preview mode, the component does not save any of the data it gathers from its source. Your channel component should immediately present the data to the user in the appropriate format for the channel’s configuration and display video data in the destination display region.
  9770. n    The SGStartRecord function (described on page 6-41) instructs the channel to begin recording data from its source. The sequence grabber component stores the collected data. The channel component should immediately begin recording data.
  9771. n    The SGIdle function (described on page 6-42) allows the sequence grabber component to grant processing time to the channel component. The SGIdle function permits the processing time for the previewing and recording operations to take place. In the example shown in Listing 6-5, the work for the channel consists of getting the current time, adding data to the movie if recording, and showing the preview image if necessary.
  9772. n    The SGStop function (described on page 6-43) stops the channel’s preview and recording operations.
  9773. n    The SGPause function (described on page 6-44) suspends or restarts the channel’s preview and recording operations.
  9774. n    The SGPrepare function (described on page 6-45) has the sequence grabber component prepare the channel for subsequent preview or record operations.
  9775. n    The SGRelease function (described on page 6-46) releases any system resources that were allocated during preview or recording operations and that remain thereafter. 
  9776. The code in Listing 6-5 illustrates a channel component’s control of the previewing and recording of a PICT image.
  9777. Listing 6-5    Controlling previewing and recording operations
  9778.  
  9779. pascal ComponentResult SGPictStartPreview (SGPictGlobals store)
  9780. {
  9781.     /* into preview mode */
  9782.     store->inPreview = (store->usage & seqGrabPreview) != 0;
  9783.     return noErr;
  9784. }
  9785. pascal ComponentResult SGPictStartRecord (SGPictGlobals store)
  9786. {
  9787.     /* into record mode (also preview, if PlayDuringRecord) */
  9788.     store->inRecord = (store->usage & seqGrabRecord) != 0;
  9789.     store->inPreview = (store->usage & seqGrabPlayDuringRecord) !=
  9790.     0;
  9791.     return noErr;
  9792. }
  9793. pascal ComponentResult SGPictIdle (SGPictGlobals store)
  9794. {
  9795.     OSErr err = noErr;
  9796.     /* this is where the work for preview and record happens */
  9797.     if (!store->paused && (store->inRecord || store->inPreview)) {
  9798.         Point mouseLoc;
  9799.         Rect r;
  9800.         PicHandle tempPict = nil;
  9801.         TimeRecord tr;
  9802.         CGrafPtr savePort;
  9803.         GDHandle saveGD;
  9804.         Rect maxR;    
  9805.         GetGWorld (&savePort, &saveGD);
  9806.         /* get the current time */
  9807.         GetTimeBaseTime (store->base, kMediaTimeScale, &tr);    
  9808.         /* figure the current area around the mouse 
  9809.             (only on main screen) */
  9810.         SetGWorld (&store->tempPort, GetMainDevice());
  9811.         GetMouse (&mouseLoc);
  9812.         LocalToGlobal (&mouseLoc);
  9813.         r.top = r.bottom = mouseLoc.v;
  9814.         r.left = r.right = mouseLoc.h;
  9815.         InsetRect(&r, -(store->srcRect.right >> 1),
  9816.                          -(store->srcRect.bottom >> 1));
  9817.         maxR = (**GetMainDevice()).gdRect;
  9818.         if (r.left < maxR.left) 
  9819.              OffsetRect (&r, -r.left + maxR.left, 0);
  9820.         if (r.top < maxR.top) 
  9821.              OffsetRect (&r, 0, -r.top + maxR.top);
  9822.         if (r.right > maxR.right) 
  9823.              OffsetRect(&r, maxR.right - r.right, 0);
  9824.         if (r.bottom > maxR.bottom) 
  9825.              OffsetRect (&r, 0, maxR.bottom - r.bottom);
  9826.         /* copy the screen into a picture */
  9827.         tempPict = OpenPicture(&r);
  9828.             CopyBits ((BitMap *)&store->tempPort.portPixMap, 
  9829.                         (BitMap *)&store->tempPort.portPixMap, &r, &r,
  9830.                                      srcCopy, nil);
  9831.             if (store->showTickCount) {
  9832.                 /* if users want to see ticks, draw them */
  9833.                 Str63 str;
  9834.                 NumToString ( TickCount(), str);    
  9835.                 /* do some magic positioning */
  9836.                 r.right = r.left + StringWidth(str) + 4; 
  9837.                 r.bottom = r.top + 14;
  9838.                 EraseRect (&r);
  9839.                 MoveTo(r.left + 2, r.bottom - 3);
  9840.                 TextSize (12);
  9841.                 DrawString (str);
  9842.             }
  9843.         ClosePicture();
  9844.         /* if recording, add data to movie */
  9845.         if (store->inRecord) {
  9846.             long offset;
  9847.             long pictSize = GetHandleSize ((Handle)tempPict);
  9848.             HLock ((Handle)tempPict);
  9849.             err = SGAddMovieData (store->grabber, store->self, 
  9850.                                     (Ptr)*tempPict, pictSize, &offset, 0,
  9851.                                      tr.value.lo, seqGrabWriteAppend);
  9852.             store->bytesWritten += pictSize;
  9853.         }
  9854.         /* if you need to show the preview image, do that */
  9855.         if (store->inPreview) {
  9856.             RgnHandle saveClip;
  9857.             SetGWorld (store->destPort, store->destGD);
  9858.             if (store->clip) {
  9859.                 saveClip = NewRgn();
  9860.                 GetClip (saveClip);
  9861.                 SetClip (store->clip);
  9862.             }
  9863.             DrawPicture (tempPict, &store->destRect);
  9864.             if (store->clip) {
  9865.                 SetClip (saveClip);
  9866.                 DisposeRgn (saveClip);
  9867.             }
  9868.         }
  9869.         KillPicture (tempPict);
  9870.         SetGWorld (savePort, saveGD);
  9871.     }
  9872.     return err;
  9873. }
  9874. pascal ComponentResult SGPictStop (SGPictGlobals store)
  9875. {
  9876.     /* stop all previewing and recording */
  9877.     store->inRecord = store->inPreview = false;
  9878.     return noErr;
  9879. }
  9880. pascal ComponentResult SGPictPause (SGPictGlobals store, 
  9881.                                                 Byte pause)
  9882. {
  9883.     /* pause */
  9884.     store->paused = pause;
  9885.     return noErr;
  9886. }
  9887. pascal ComponentResult SGPictPrepare (SGPictGlobals store,
  9888.                                              Boolean prepareForPreview,
  9889.                                              Boolean prepareForRecord)
  9890. {
  9891.     /* prepare for previewing and recording operations--
  9892.         all you do here is initialize a variable */
  9893.     store->bytesWritten = 0;
  9894.     return noErr;
  9895. }
  9896. pascal ComponentResult SGPictRelease (SGPictGlobals store)
  9897. {
  9898.     /* no resources to release after previewing or recording */
  9899.     return noErr;
  9900. }
  9901. Managing Channel Devices
  9902.  
  9903. To manage channel devices such as video digitizers or sound input drivers, you should
  9904. n    let the sequence grabber retrieve a list of devices that are valid for the channel using the SGGetChannelDeviceList function (described on page 6-60)
  9905. n    assign an appropriate channel device with the SGSetChannelDevice function (described on page 6-61)
  9906. Listing 6-6 provides examples of these required functions for channel device management. The SGPictGetChannelDeviceList function obtains a list of devices associated with the channel component. The SGPictSetChannelDevice function allows the sequence grabber to specify a channel device. In this code sample, there are no devices associated with the channel component. 
  9907. Listing 6-6    Coordinating devices for the channel component
  9908.  
  9909. pascal ComponentResult SGPictGetChannelDeviceList 
  9910.                                 (SGPictGlobals store, 
  9911.                                  long selectionFlags, 
  9912.                                  SGDeviceList *list)
  9913. {
  9914.     *list = (SGDeviceList) NewHandleClear 
  9915.                         (sizeof (SGDeviceListRecord)); /* no devices */
  9916.     return MemError();
  9917. }
  9918. pascal ComponentResult SGPictSetChannelDevice 
  9919.                                     (SGPictGlobals store, StringPtr name)
  9920. {
  9921.     /* you have no devices, so no problem */
  9922.     return noErr;
  9923. }
  9924. Utility Functions for Recording Image Data
  9925.  
  9926. To record image data, the channel component must allow the sequence grabber to do the following:
  9927. n    Obtain an appropriate time scale with the SGGetChannelTimeScale function (described on page 6-55).
  9928. n    Retrieve the sample description of the image that is to be recorded with the SGGetChannelSampleDescription function (described on page 6-55).
  9929. n    Create a track and media in which to record the sample image by calling the SGWriteSamples function (described on page 6-43). SGWriteSamples writes the captured data to a movie file after a record operation.
  9930. n    Obtain references from the sequence grabber and add them to the newly created media using the SGGetNextFrameReference function (described on page 6-88) so that the channel component can retrieve the sample references it stored. 
  9931. n    Determine how many bytes of captured data the channel is collecting each second using the SGGetDataRate function (described on page 6-54).
  9932. The code in Listing 6-7 shows how the channel component uses these utility functions to record PICT image data. 
  9933. Listing 6-7    Recording image data
  9934.  
  9935. pascal ComponentResult SGPictGetChannelTimeScale 
  9936.                                     (SGPictGlobals store, TimeScale *scale)
  9937. {
  9938.     *scale = kMediaTimeScale;         /* a reasonable default time scale */
  9939.     return noErr;
  9940. }
  9941. pascal ComponentResult SGPictGetChannelSampleDescription
  9942.                                  (SGPictGlobals store, Handle sampleDesc)
  9943. {
  9944.     OSErr err;
  9945.     SampleDescriptionPtr sdp;
  9946.     SetHandleSize (sampleDesc, sizeof(SampleDescription));
  9947.     if (err = MemError()) goto bail;
  9948.     /* make up a minimal sample description */
  9949.     sdp = (SampleDescriptionPtr)*sampleDesc;
  9950.     sdp->descSize = sizeof(SampleDescription);
  9951.     sdp->dataFormat = 'PICT';
  9952.     sdp->resvd1 = 0;
  9953.     sdp->resvd2 = 0;
  9954.     sdp->dataRefIndex = 0;
  9955. bail:
  9956.     return err;
  9957. }
  9958. pascal ComponentResult SGPictWriteSamples (SGPictGlobals store,
  9959.                                                  Movie m, AliasHandle theFile)
  9960. {
  9961.     OSErr err = 0;
  9962.     Track pictT;
  9963.     Media pictM;
  9964.     long i;
  9965.     MatrixRecord aMatrix;
  9966.     Rect from, to;
  9967.     seqGrabFrameInfo fi;
  9968.     TimeRecord tr;
  9969.     TimeValue mediaDuration;
  9970.     SampleDescriptionHandle sampleDesc = 0;
  9971.     /* after SGStop, this function creates the track and media */
  9972.     if (!(store->usage & seqGrabRecord))
  9973.         return err;
  9974.     /* get the sample description */
  9975.     sampleDesc = (SampleDescriptionHandle)NewHandle(4);
  9976.     if (err = MemError()) goto bail;
  9977.     if (err = SGGetChannelSampleDescription (store->self,
  9978.                                              (Handle)sampleDesc)) goto bail;
  9979.     /* figure out the track matrix */
  9980.     SetRect (&from, 0, 0, store->srcRect.right,
  9981.              store->srcRect.bottom);
  9982.     to = from;
  9983.     TransformRect (&store->displayMatrix, &to, nil);
  9984.     /* create the track and media */
  9985.     pictT = NewMovieTrack (m, (long)from.right << 16,
  9986.                                  (long)from.bottom << 16, 0);
  9987.     pictM = NewTrackMedia (pictT, 'PICT', kMediaTimeScale,
  9988.                                  (Handle)theFile, rAliasType);
  9989.     /* spin in a loop getting sample references from the 
  9990.         sequence grabber and adding them to the media */
  9991.     fi.frameChannel = store->self;
  9992.     i = -1;
  9993.     do {
  9994.         TimeValue frameDuration;
  9995.         err = SGGetNextFrameReference (store->grabber, 
  9996.                                                 &fi, &frameDuration, &i);
  9997.         if (err) {
  9998.             if (err == paramErr)
  9999.                 err = 0;
  10000.             break;
  10001.         }
  10002.         err = AddMediaSampleReference (pictM, 
  10003.                 fi.frameOffset, fi.frameSize,
  10004.                 frameDuration,
  10005.                 sampleDesc, 1,
  10006.                 0, 0);
  10007.         if (err == invalidDuration) {
  10008.             err = noErr;
  10009.             break;
  10010.         }
  10011.     } while (!err);
  10012. done:
  10013.     if (err) goto bail;
  10014.     GetTimeBaseTime (store->base, 0, &tr);
  10015.     ConvertTimeScale (&tr, kMediaTimeScale);        /* trim media inserted
  10016.                                                              to not extend
  10017.                                                              beyond end time */
  10018.     mediaDuration = GetMediaDuration(pictM);
  10019.     /* add media to track */
  10020.     err = InsertMediaIntoTrack (pictT, 0, 0, tr.value.lo, kFix1);
  10021.     /* set track matrix */
  10022.     RectMatrix (&aMatrix, &from, &to);
  10023.     SetTrackMatrix (pictT, &aMatrix);
  10024.     /* set track clipping region */
  10025.     SetTrackClipRgn (pictT, store->clip);
  10026. bail:
  10027.     if (sampleDesc) DisposHandle ((Handle)sampleDesc);
  10028.     return err;
  10029. }
  10030. pascal ComponentResult SGPictGetDataRate (SGPictGlobals store,
  10031.                                                          long *bytesPerSecond)
  10032. {
  10033.     /* take a guess at the data rate */
  10034.     *bytesPerSecond = 24 * 1024;
  10035.     if (store->bytesWritten) {
  10036.         TimeValue timeNow = GetTimeBaseTime (store->base, 8, nil); 
  10037.                                     /* one-eighth second resolution */
  10038.         if (!timeNow)
  10039.             return seqGrabInfoNotAvailable;
  10040.         *bytesPerSecond = (store->bytesWritten / timeNow) * 8;  
  10041.                                             /* convert back to seconds */
  10042.     }
  10043.     return noErr;
  10044. }
  10045. Providing Media-Specific Functions
  10046.  
  10047. The channel can provide media-specific functions for a particular channel type. 
  10048. These functions are analogous to the SGSetVideoCompressorType and SGGetVideoCompressorType functions (described on page 6-66 and page 6-67, respectively). These functions allow the sequence grabber to specify and determine the type of image compression the channel component is to apply to the captured video images.
  10049. The code in Listing 6-8 provides two specialized channel component functions, SGPictSetShowTickCount and SGPictGetShowTickCount, which set and retrieve the tick count, respectively. Note that both the functions refer to the showTickCount field in the SGPictGlobals structure.
  10050. Listing 6-8    Showing the tick count
  10051.  
  10052. pascal ComponentResult SGPictSetShowTickCount 
  10053.                                         (SGPictGlobals store, Boolean show)
  10054. {
  10055.     store->showTickCount = show;
  10056.     return noErr;
  10057. }
  10058. pascal ComponentResult SGPictGetShowTickCount 
  10059.                                         (SGPictGlobals store, Boolean *show)
  10060. {
  10061.     *show = store->showTickCount;
  10062.     return noErr;
  10063. }
  10064. Managing the Settings Dialog Box
  10065.  
  10066. The channel allows the sequence grabber to manage the placement of your channel data in the sequence grabber’s settings dialog box.
  10067. n    To prepare to add the channel component’s items to the settings dialog box, the sequence grabber obtains your item list by calling the sequence grabber panel component’s SGPanelGetDITL function. It retrieves and detaches the dialog box template from the sequence grabber panel component. 
  10068. n    Once it has installed the items, the sequence grabber uses the SGPanelInstall function so initial values can be set. This function resets the channel to use the dialog window and preview mode. It also updates the boundaries to match the size of the user item list.
  10069. n    To provide idle time in which to draw the channel’s information in the settings dialog box, the sequence grabber uses the SGPanelEvent function. It allows the sequence grabber component to receive and process dialog events in a manner similar to a modal-dialog filter function. In this example, the information is the tick count.
  10070. n    Prior to the removal of items from the settings dialog box, the sequence grabber component calls the SGPanelRemove function. The sequence grabber supplies information that specifies the channel that the panel is to configure, the dialog box, and the offset of the panel’s items into the dialog box. 
  10071. For details on the SGPanelGetDITL, SGPanelInstall, SGPanelEvent, and SGPanelRemove functions, see the chapter “Sequence Grabber Panel Components” in this book.
  10072. The code in Listing 6-9 calls the sequence grabber panel component and indicates that the channel component will display a tick count checkbox in the panel settings.
  10073. Listing 6-9    Including a tick count checkbox in a dialog box in the panel component
  10074.  
  10075. pascal ComponentResult SGPictPanelGetDitl (SGPictGlobals store,
  10076.                                                          Handle *ditl)
  10077. {
  10078.     /* get and detach your dialog template */
  10079.     *ditl = GetResource('DITL', 7000); 
  10080.     if (!*ditl) return resNotFound;
  10081.     DetachResource(*ditl);
  10082.     return noErr;
  10083. }
  10084. pascal ComponentResult SGPictPanelInstall (SGPictGlobals store,
  10085.                                                          SGChannel c, 
  10086.                                                          DialogPtr d, 
  10087.                                                          short itemOffset)
  10088. {
  10089.     Rect newBounds;
  10090.     short kind;
  10091.     Handle h;
  10092.     /* reset this channel to use the dialog window and be in
  10093.         preview mode with no clip */
  10094.     SGSetGWorld (store->self, (CGrafPtr)d, GetMainDevice());
  10095.     SGGetChannelUsage (store->self, &store->saveUsage);
  10096.     SGSetChannelUsage (store->self, seqGrabPreview);
  10097.     SGSetChannelClip (c, nil);
  10098.     /* update boundaries to match size of user item */
  10099.     GetDItem (d, 1 + itemOffset, &kind, &h, &newBounds);
  10100.     SGSetChannelBounds (c, &newBounds);
  10101.     SGStartPreview (store->self);
  10102.     return noErr;
  10103. }
  10104. pascal ComponentResult SGPictPanelEvent (SGPictGlobals store,
  10105.                                                 SGChannel c, DialogPtr d,
  10106.                                                 short itemOffset, 
  10107.                                                 EventRecord *theEvent, 
  10108.                                                 short *itemHit, 
  10109.                                                 Boolean *handled)
  10110. {
  10111.     /* use idle time to draw */
  10112.     if (theEvent->what == nullEvent)
  10113.         return SGIdle (store->self);
  10114.     return noErr;
  10115. }
  10116. pascal ComponentResult SGPictPanelRemove (SGPictGlobals store,
  10117.                                                      SGChannel c, DialogPtr d,
  10118.                                                      short itemOffset)
  10119. {
  10120.     /* stop playing */
  10121.     SGStop (store->self);
  10122.     SGRelease (store->self);
  10123.     /* note that the clip and bounds are automatically restored
  10124.      for you because you stored them using the SGGetSettings
  10125.      function */
  10126.     /* restore usage */
  10127.     SGSetChannelUsage(store->self, store->saveUsage);
  10128.     return noErr;
  10129. }
  10130. Displaying Channel Information in the Settings Dialog Box
  10131.  
  10132. The final step in the implementation of a sequence grabber channel component is the display of the channel preview in the settings dialog box. Two sequence grabber functions, SGSettingsDialog and SGGetSettingsDialog (described in the chapter “Sequence Grabber Components” in this book), facilitate this process. 
  10133. n    The channel component instructs the sequence grabber to display its settings dialog box to the user by calling the sequence grabber component’s SGSettingsDialog function. The user can specify the configuration of a sequence grabber channel in this dialog box. 
  10134. n    To retrieve the current settings of all channels used by the sequence grabber, call the SGGetSettings function. The sequence grabber places all of this configuration information into a Movie Toolbox user data list.
  10135. Listing 6-10 provides code that creates a user data list to contain the tick count information for the sequence grabber’s settings dialog box, adds a matrix to the list, and stores clipping information (if any exists). The sample code then restores the clipping and the matrix.
  10136. Listing 6-10    Displaying channel settings
  10137.  
  10138. pascal ComponentResult SGPictPanelGetSettings 
  10139.                                         (SGPictGlobals store, SGChannel c,
  10140.                                          UserData *result, long flags)
  10141. {
  10142.     OSErr err = noErr;
  10143.     UserData ud = 0;
  10144.     MatrixRecord matrix;
  10145.     RgnHandle clip;
  10146.     /* create a user data list to hold your state */
  10147.     if (err = NewUserData (&ud)) goto bail;
  10148.     /* add matrix to user data */
  10149.     if (SGGetChannelMatrix (c, &matrix) == noErr) {
  10150.         if (err = SetUserDataItem (ud, &matrix, sizeof(matrix),
  10151.                                          sgMatrixType, 1)) 
  10152.             goto bail;
  10153.     }
  10154.     /* store clip, if there is one */
  10155.     if (SGGetChannelClip (c, &clip) == noErr) {
  10156.         if (clip)
  10157.             err = AddUserData (ud, (Handle)clip, sgClipType);
  10158.         else
  10159.             err = SetUserDataItem (ud, nil, 0, sgClipType, 1);    
  10160.                                         /* add a dummy to indicate none */
  10161.         DisposeRgn(clip);
  10162.         if (err) goto bail;
  10163.     }
  10164. bail:
  10165.     if (err) {
  10166.         DisposeUserData (ud);
  10167.         ud = 0;
  10168.     }
  10169.     *result = ud;
  10170.     return err;
  10171. }
  10172. pascal ComponentResult SGPictPanelSetSettings 
  10173.                                     (SGPictGlobals store, 
  10174.                                      SGChannel c, UserData ud, long flags)
  10175. {
  10176.     OSErr err;
  10177.     RgnHandle clip = NewRgn();
  10178.     MatrixRecord matrix;
  10179.     /* restore clip, if one was stored */
  10180.     if (GetUserData (ud, (Handle)clip, sgClipType, 1) == noErr) {
  10181.         if (err = SGSetChannelClip 
  10182.                         (c, GetHandleSize ((Handle)clip) ? clip : 0))
  10183.             goto bail;
  10184.     }
  10185.     /* restore matrix */
  10186.     if (err = GetUserDataItem (ud, &matrix, sizeof(matrix),
  10187.                                          sgMatrixType, 1)) goto bail;
  10188.     if (err = SGSetChannelMatrix (c, &matrix)) 
  10189.          goto bail;
  10190. bail:
  10191.     DisposeRgn (clip);
  10192.     return err;
  10193. }
  10194.  
  10195. Using Sequence Grabber Channel Components
  10196.  
  10197. In response to application requests, sequence grabber components can use channel components in two ways: to play digitized data for the user or to save captured data in a QuickTime movie. The process of playing digitized data is called previewing; saving captured data in a movie is called recording. Applications can use previewing to allow the user to prepare to make a recording. Applications that use previewing can move directly from the preview operation to a record operation, without stopping the process.
  10198. The next two sections provide an overview of preview and record operations. A third section discusses the callback functions that are supported by some channel components. 
  10199. Previewing
  10200.  
  10201. Previewing captured data involves playing that data for the user as it is digitized. For video data, this means displaying the video images on the computer screen. For audio data, this means playing the sound through the computer’s sound system. The following paragraphs outline the steps the sequence grabber component follows to preview captured data.
  10202.     1.    First, the sequence grabber component opens a connection to your channel component, using the Component Manager’s OpenComponent function. The sequence grabber component then calls your SGInitChannel function to initialize your component. For more on SGInitChannel, see page 6-38.
  10203.     2.    The sequence grabber component then configures your channel component for the preview operation. The SGSetGWorld function (described on page 6-39) sets the graphics world in which the preview is to be displayed. The SGSetChannelUsage function (described on page 6-48) specifies that your channel is to be used for previewing. The application can then use the appropriate channel configuration functions to prepare your channel for the preview operation. For video channels, it uses the functions discussed in “Configuration Functions for Video Channel Components” beginning on page 6-61. For sound channels, the sequence grabber uses the functions discussed in “Configuration Functions for Sound Channel Components” beginning on page 6-77. 
  10204.     3.    The sequence grabber component starts the preview operation by calling your SGStartPreview function (described on page 6-40). The sequence grabber component then begins collecting data from all of the channels participating in the preview and plays that data appropriately. The sequence grabber component can pause and restart the preview by calling the SGPause function (described on page 6-44). The sequence grabber component uses the SGStop function (described 
  10205. on page 6-43) to stop the preview. During the preview operation, the sequence grabber component calls your SGIdle function (described on page 6-42) frequently, so that your channel can perform its operation.
  10206.     4.    When the application is done previewing, the sequence grabber component can start recording or close its connection to your component. 
  10207. Recording
  10208.  
  10209. During a record operation, a sequence grabber component collects the data it captures and formats that data into a QuickTime movie. During a record operation, the sequence grabber component can also play the captured data for the user. 
  10210. The following paragraphs discuss the steps the sequence grabber component follows to record captured data.
  10211.     1.    As with a preview operation, the sequence grabber component establishes a connection to your channel component by calling the Component Manager’s OpenComponent function. It then initializes your component by calling your SGInitChannel function (described on page 6-38).
  10212.     2.    The sequence grabber component then configures your component for the record operation. The SGSetGWorld function (described on page 6-39) sets the graphics world in which the data is to be displayed. The SGSetChannelUsage function (described on page 6-48) specifies each channel that is to be used for recording. At this time, the sequence grabber component can also specify whether your component is to play its data while recording. The application can then use the appropriate channel configuration functions to prepare your channel for the record operation. For video channels, it uses the functions discussed in “Configuration Functions for Video Channel Components” beginning on page 6-61. For sound channels, the sequence grabber uses the functions discussed in “Configuration Functions for Sound Channel Components” beginning on page 6-77. 
  10213.     3.    The sequence grabber component starts the record operation by calling your SGStartRecord function (described on page 6-41). The sequence grabber component then begins collecting data from the channels it has assigned, stores the data in a QuickTime movie, and, optionally, plays that data appropriately. The sequence grabber can pause and restart the record process by calling the SGPause function (described on page 6-44). During the record operation, the sequence grabber component calls your SGIdle function (described on page 6-42) frequently, so that your channel can perform its operation. The sequence grabber component uses the SGStop function (described on page 6-43) to stop the record operation. At this time, your component saves the movie in the appropriate movie file if the sequence grabber component instructs your component to do so by calling your SGWriteSamples function (described on page 6-43).
  10214.     4.    When the application is done recording, it either returns to previewing or closes its connection to your component.
  10215. Working With Callback Functions
  10216.  
  10217. Sequence grabber components provide callback functions that allow application developers to customize some aspects of capturing video data. It is your channel component’s responsibility to call these callback functions at specified points in the data capture process. The application’s function can then perform any special processing that is appropriate for the application. For example, an application can overlay text, such as a frame number, on each frame of video data as it is captured. These functions are discussed in detail in the next section. 
  10218. Note
  10219. Sound channel components do not support any callback functions.u
  10220. Using Callback Functions for Video Channel Components
  10221.  
  10222. Sequence grabber components allow application developers to define a number of callback functions in their applications. Your channel component calls these functions at specific points in the process of collecting, compressing, and displaying the source visual data. By defining callback functions, a developer can control the process more precisely or customize the operation of the sequence grabber component and its channel components.
  10223. For example, a developer could use a callback function to draw a frame number on each video frame as it is collected. In this case, the developer could use either a compress callback function or a grab-complete callback function. You call the compress function after each frame is collected, in order to compress the frame. You call the grab-complete function just before the compress function or as soon as the frame has been captured.
  10224. Note that your channel component need not call each and every callback function. If some functions are inappropriate to the operation of your channel, do not call them. However, if your component calls one function of a pair, be sure to call the other. For example, if your component calls an application’s grab function, you must also call its grab-complete function.
  10225. The sequence grabber component uses the SGSetVideoBottlenecks function to assign callback functions to your video channel. The SGGetVideoBottlenecks function allows the sequence grabber to determine the callback functions that have been assigned to your video channel. See the chapter “Sequence Grabber Components” in this book for details on SGSetVideoBottlenecks and SGGetVideoBottlenecks.
  10226. The following application-defined functions are supported by video channels and are described in the chapter “Sequence Grabber Components” in this book.MyAddFrameFunction    MyGrabCompressCompleteFunction    
  10227. MyCompressCompleteFunction    MyGrabFunction    
  10228. MyCompressFunction    MyTransferFrameFunction    
  10229. MyDisplayFunction        
  10230. MyGrabCompleteFunction        
  10231.  
  10232. Using Utility Functions for Video Channel Component Callback Functions 
  10233.  
  10234. Sequence grabber components provide a number of functions that application-defined functions can use. Several channel functions support those sequence grabber 
  10235. component functions.
  10236. The sequence grabber component uses the SGGetBufferInfo function to obtain information about a buffer that contains data to be manipulated by a callback function. Application callback functions can use the SGGetBufferInfo function to obtain information about a buffer that you have passed. This information is valid only 
  10237. during record operations, or after your channel has been prepared to record. The SGGetBufferInfo function is described in detail in the chapter “Sequence Grabber Components” in this book.
  10238. The following functions provide default behavior for application-defined grab, grab-complete, display, compress, compress-complete, add-frame, transfer-frame, display-compress, and grab-compress–complete functions: 
  10239. n    Your video channel component’s SGGrabFrame function provides the default behavior for an application’s grab function. Applications should call this function only from their grab function.
  10240. n    Your channel component’s SGGrabFrameComplete function provides the default behavior for an application’s grab-complete function. Applications should call this function only from their grab-complete functions. 
  10241. n    Your channel component’s SGDisplayFrame function provides the default behavior for an application’s display function. Applications should call this function only from their display functions. 
  10242. n    Your video channel component’s SGCompressFrame function provides the default behavior for an application’s compress function. Applications should call this function only from their compress functions. 
  10243. n    Your channel component’s SGCompressFrameComplete function provides the default behavior for an application’s compress-complete function. Applications should call this function only from their compress-complete functions. 
  10244. n    Your component’s SGAddFrame function provides the default behavior for an application’s add-frame function. Applications should call this function only from their add-frame functions. 
  10245. n    Your component’s SGTransferFrameForCompress function provides the default behavior for an application’s transfer-frame function. Applications should call this function only from their transfer-frame functions. 
  10246. n    Your component’s SGGrabCompressComplete function provides the default behavior for an application’s grab-compress–complete function. Applications should call this function only from their grab-compress–complete function.
  10247. n    Your component’s SGDisplayCompress function provides the default behavior for an application’s display-compress function. Applications should call this function only from their display-compress function.
  10248.  
  10249. Sequence Grabber Channel Components Reference
  10250.  
  10251. This section describes the functions and associated data structures and constants that are specific to the Apple-supplied sequence grabber channel component. These functions are described from the perspective of a sequence grabber component—the most likely client of a sequence grabber channel component. If you are developing a sequence grabber channel component, your component must behave as described here.
  10252. Functions
  10253.  
  10254. This section has been divided into the following topics:
  10255. n    “Configuring Sequence Grabber Channel Components” describes the functions that allow sequence grabber components to configure your channel component.
  10256. n    “Controlling Sequence Grabber Channel Components” discusses the functions that allow sequence grabber components to control your channel component.
  10257. n    “Configuration Functions for All Channel Components” describes configuration functions that may be supported by all sequence grabber channel components.
  10258. n    “Working With Channel Devices” discusses functions that allow the sequence grabber to assign devices to your channel.
  10259. n    “Configuration Functions for Video Channel Components” describes functions that are supported only by video channel components.
  10260. n    “Configuration Functions for Sound Channel Components” discusses functions that are supported only by sound channel components.
  10261. n    “Utility Functions for Sequence Grabber Channel Components” describes several utility functions that sequence grabber components provide to sequence grabber channel components.
  10262. Note
  10263. If your channel component will also receive any of the functions defined in the interface for sequence grabber panel components, see the chapter “Sequence Grabber Panel Components” in this book for more information about these functions.u
  10264. Configuring Sequence Grabber Channel Components
  10265.  
  10266. Sequence grabber components use a number of functions to establish the environment for grabbing or previewing digitized data. This section describes the channel component functions that allow the sequence grabber component to establish the environment for recording or previewing captured data. 
  10267. The sequence grabber component uses the SGInitChannel function to initialize your channel prior to a record or preview operation.
  10268. The SGSetGWorld function allows the sequence grabber component to assign a graphics world to your component.
  10269. SGInitChannel
  10270.  
  10271. A sequence grabber component calls the SGInitChannel function to initialize a sequence grabber channel component. Your component should perform its initialization processing here, rather than in response to the Component Manager’s open request. The initialization processing may include allocating memory or checking for the availability of special-purpose hardware or software. 
  10272. pascal ComponentResult SGInitChannel (SGChannel c, 
  10273.                                                     SeqGrabComponent owner);
  10274. c    Identifies the channel connection for this operation. 
  10275. owner    Identifies the sequence grabber component that has connected to your channel component. You should save this value so that your channel component can call the utility functions that are provided by the sequence grabber component (see “Utility Functions for Sequence Grabber Channel Components,” which begins on page 6-84, for information about these utility functions).
  10276. DESCRIPTION
  10277. If your component cannot gain access to the resources or equipment it needs to function properly, you should return a nonzero result code. If you return a nonzero result, the sequence grabber component closes its connection to your component and reports the error to the calling application.
  10278. RESULT CODESnoDeviceForChannel    –9400    Channel component cannot find its device    
  10279.  
  10280. File Manager errors
  10281. Memory Manager errors
  10282. SGSetGWorld
  10283.  
  10284. A sequence grabber component calls the SGSetGWorld function to establish the display environment for your channel component. 
  10285. pascal ComponentResult SGSetGWorld (SeqGrabComponent s, 
  10286.                                                     CGrafPtr gp, GDHandle gd);
  10287. s    Identifies the sequence grabber component that has connected to your channel component. 
  10288. gp    Specifies the destination graphics port. The sequence grabber component always sets this parameter to a valid value. The specified graphics port must be a color graphics port. The parameter is set to nil to use the current graphics port.
  10289. gd    Specifies the destination graphics device. The sequence grabber component always sets this parameter to a valid value.
  10290. DESCRIPTION
  10291. Note that sequence grabber components may call this function for sound channel components as well as for video channel components. 
  10292. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  10293.  
  10294. Controlling Sequence Grabber Channel Components
  10295.  
  10296. Sequence grabber channel components must provide a full set of functions that allow 
  10297. the sequence grabber component to control the preview or record operation. The sequence grabber component can use these functions to start and stop the operation, to pause data collection, and to write captured data to a movie. This section describes these functions.
  10298. The sequence grabber component uses the SGStartPreview function to start a preview operation. The SGStartRecord function starts a record operation. The SGStop function stops your channel component after a preview or record operation. 
  10299. The sequence grabber component grants processing time to your channel component 
  10300. by calling the SGIdle function. The sequence grabber notifies you of update events by calling your SGUpdate function.
  10301. The sequence grabber pauses the current operation by calling the SGPause function.
  10302. The sequence grabber component calls your SGWriteSamples function to write captured data to a movie file after a record operation.
  10303. The sequence grabber component prepares your channel component for an upcoming preview or record operation by calling the SGPrepare function. This function also allows the sequence grabber component to verify that your component can support the parameters an application has specified. The SGRelease function releases system resources allocated during the SGPrepare function.
  10304. SGStartPreview
  10305.  
  10306. The SGStartPreview function instructs your channel to begin processing its source data. In preview mode, your component does not save any of the data it gathers from its source. 
  10307. pascal ComponentResult SGStartPreview (SeqGrabComponent s);
  10308. s    Identifies the sequence grabber component that has connected to your channel component. 
  10309. DESCRIPTION
  10310. Your channel component should immediately present the data to the user in the appropriate format, according to your channel’s configuration (see “Configuration Functions for All Channel Components,” which begins on page 6-46, for information about functions that configure channels). Display video data in the destination display region; play sound data at the specified volume settings. 
  10311. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  10312. deviceCantMeetRequest    –9408    Device cannot support grabber    
  10313.  
  10314. File Manager errors
  10315. Memory Manager errors
  10316. SEE ALSO
  10317. The sequence grabber component stops the preview process by calling your SGStop function, which is described on page 6-43.
  10318. SGStartRecord
  10319.  
  10320. The SGStartRecord function instructs your channel component to begin recording data from its source. The sequence grabber component stores the collected data according to the recording parameters that the calling application specified with the sequence grabber component’s SGSetDataOutput function (described in the chapter “Sequence Grabber Components” in this book). Your channel component should immediately begin recording data in the appropriate format, according to your channel’s configuration (see “Configuration Functions for All Channel Components,” which begins on page 6-46, for information about functions that configure channels). 
  10321. pascal ComponentResult SGStartRecord (SeqGrabComponent s);
  10322. s    Identifies the sequence grabber component that has connected to your channel component. 
  10323. DESCRIPTION
  10324. The sequence grabber component can switch from previewing to recording by calling this function during a preview operation—the sequence grabber need not stop the preview operation first. 
  10325. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  10326. notEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  10327. notEnoughDiskSpaceToGrab    –9404    Insufficient disk space for record operation    
  10328. deviceCantMeetRequest    –9408    Device cannot support grabber    
  10329.  
  10330. File Manager errors
  10331. Memory Manager errors
  10332. SEE ALSO
  10333. The sequence grabber component stops the recording process by calling your SGStop function, which is described on page 6-43.
  10334. SGIdle
  10335.  
  10336. The SGIdle function provides processing time to your channel component. 
  10337. pascal ComponentResult SGIdle (SeqGrabComponent s);
  10338. s    Identifies the sequence grabber component that has connected to your channel component. 
  10339. DESCRIPTION
  10340. After starting a preview or record operation, the application calls the sequence grabber component’s SGIdle function as often as possible. The sequence grabber component then calls your SGIdle function. This continues until the calling application stops the operation by calling the SGStop sequence grabber function. 
  10341. Your SGIdle function reports several status and error conditions by means of its result code. If your component returns a nonzero result code during a record operation, the application should still call the SGStop function (described on page 6-43) so that the sequence grabber component can store the data it has collected.
  10342. RESULT CODES
  10343. File Manager errors
  10344. Memory Manager errors
  10345. SGUpdate
  10346.  
  10347. The SGUpdate function allows you to learn about update events. This gives you an opportunity to update your display. 
  10348. pascal ComponentResult SGUpdate (SeqGrabComponent s,                         
  10349.                                                 RgnHandle updateRgn);
  10350. s    Identifies the sequence grabber component that has connected to your channel component.
  10351. updateRgn    Indicates the part of the window that has been changed. This parameter specifies a portion of the window that has been changed. Applications can obtain this information by examining the appropriate window record. For example, they may call the sequence grabber in this manner:
  10352.             SGUpdate (theSG, ((WindowPeek)updateWindow)->updateRgn);
  10353.     If this parameter is set to nil, use the window’s current visible region.
  10354. DESCRIPTION
  10355. Applications call the sequence grabber’s SGUpdate function whenever they receive an update event for a window that contains a sequence grabber display. The sequence grabber then calls each affected channel. Applications should call this function before calling the Window Manager’s BeginUpdate function.
  10356. RESULT CODEdeviceCantMeetRequest    –9408    Device cannot support grabber    
  10357.  
  10358. SGStop
  10359.  
  10360. The SGStop function stops a preview or record operation.
  10361. pascal ComponentResult SGStop (SeqGrabComponent s);
  10362. s    Identifies the sequence grabber component that has connected to your channel component. 
  10363. DESCRIPTION
  10364. In the case of a record operation, the sequence grabber component stores the collected movie data in the assigned movie file. The sequence grabber component then calls your SGWriteSamples function (described in the next section) to place the references to the captured data into the movie after it calls SGStop.
  10365. sWARNING
  10366. It is dangerous to allow an update event to occur during recording. Many digitizers capture directly to the screen, and an update event will result in data loss.s
  10367. RESULT CODES
  10368. File Manager errors
  10369. Memory Manager errors
  10370. SGWriteSamples
  10371.  
  10372. The sequence grabber component calls the SGWriteSamples function when it is ready to add recorded data to a movie. 
  10373. pascal ComponentResult SGWriteSamples (SGChannel c, Movie m,
  10374.                                                      AliasHandle theFile);
  10375. c    Identifies the channel connection for this operation. 
  10376. m    Identifies the movie to which your component should add the captured data. Your component should not make any other changes to the movie identified by this reference. Use the SGWriteMovieData function, described on page 6-86. 
  10377. theFile    Identifies the movie file. The sequence grabber component provides this alias so that you can supply it to the Movie Toolbox. You should not open this file or write to it directly. Use the SGWriteMovieData function. 
  10378. DESCRIPTION
  10379. The sequence grabber component calls this function when the recording operation is complete, after calling your SGStop function (described on page 6-43). In this manner, your channel component can avoid unnecessary Movie Toolbox overhead during the record operation.
  10380. SPECIAL CONSIDERATIONS
  10381. Your component should dispose of any buffered data and add the captured data to the movie. If necessary, use the Movie Toolbox’s functions to create a track and a media. See the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for details. 
  10382. RESULT CODES
  10383. File Manager errors
  10384. Memory Manager errors
  10385. SGPause
  10386.  
  10387. A sequence grabber component can suspend or restart a record or preview operation by calling the SGPause function. 
  10388. pascal ComponentResult SGPause (SeqGrabComponent s, Byte pause);
  10389. s    Identifies the sequence grabber component that has connected to your channel component. 
  10390. pause    Instructs your component to suspend or restart the current operation. The following values are valid:
  10391. seqGrabUnpause
  10392. Restart the current operation.
  10393. seqGrabPause    
  10394. Pause the current operation.
  10395. DESCRIPTION
  10396. The sequence grabber component supplies a constant value in the paused parameter that instructs your component to pause or restart the current operation.
  10397. SPECIAL CONSIDERATIONS
  10398. Your component should not release any system resources or temporary memory associated with the current operation—you should be ready to restart the operation immediately.
  10399. RESULT CODESdeviceCantMeetRequest    –9408    Device cannot support grabber    
  10400.  
  10401. File Manager errors
  10402. Memory Manager errors
  10403. SGPrepare
  10404.  
  10405. The SGPrepare function instructs your component to get ready to begin a preview or record operation (or both)—the sequence grabber component specifies the operations. 
  10406. pascal ComponentResult SGPrepare (SeqGrabComponent s, 
  10407.                                              Boolean prepareForPreview,
  10408.                                              Boolean prepareForRecord);
  10409. s    Identifies the sequence grabber component that has connected to your channel component. 
  10410. prepareForPreview
  10411. Instructs your component to prepare for a preview operation. The sequence grabber component sets this parameter to true to prepare for a preview operation. The sequence grabber component may set both the prepareForPreview and prepareForRecord parameters to true.
  10412. prepareForRecord
  10413. Instructs your component to prepare for a record operation. The sequence grabber component sets this parameter to true to prepare for a record operation. The sequence grabber component may set both the prepareForPreview and prepareForRecord parameters to true.
  10414. DESCRIPTION
  10415. Your component should do whatever is necessary to get ready to start the operation. The goal is to reduce the delay between the time when the sequence grabber calls your SGStartPreview function (described on page 6-40) or SGStartRecord function (described on page 6-41) and the time when the operation actually begins. This may involve allocating memory or readying special hardware.
  10416. SPECIAL CONSIDERATIONS
  10417. If the sequence grabber calls SGPrepare without subsequently starting a record or preview operation, it calls the SGRelease function (described in the next section) later. This allows your component to release any system resources it allocated during the SGPrepare function.
  10418. RESULT CODESparamErr    –50    Invalid parameter specified    
  10419. notEnoughDiskSpaceToGrab    –9404    Insufficient disk space for record operation    
  10420. deviceCantMeetRequest    –9408    Device cannot support grabber    
  10421.  
  10422. File Manager errors
  10423. Memory Manager errors
  10424. SGRelease
  10425.  
  10426. The SGRelease function instructs your component to release any system resources it allocated during the SGPrepare function, which is described in the previous section. 
  10427. pascal ComponentResult SGRelease (SeqGrabComponent s);
  10428. s    Identifies the sequence grabber component that has connected to your channel component.
  10429. DESCRIPTION
  10430. The sequence grabber component calls your SGRelease function whenever it calls SGPrepare without subsequently starting a record or preview operation.
  10431. SPECIAL CONSIDERATIONS
  10432. Note that the sequence grabber component may call SGRelease more than once after calling SGPrepare.
  10433. Configuration Functions for All Channel Components
  10434.  
  10435. Sequence grabber components use channel components to obtain digitized data from external media. Your channel is assigned to a sequence grabber component when the application calls the sequence grabber component’s SGNewChannel function, described in the chapter “Sequence Grabber Components” in this book. The sequence grabber component must configure your channel before a preview or record operation. Your channel component must provide a number of functions that allow the sequence grabber to configure the characteristics of your channel. Several of these functions work on any channel component. This section discusses these general channel configuration functions.
  10436. In addition, channel components provide functions that are specific to the channel type. The sequence grabber component supplied by Apple uses two types of channel components: video channel components and sound channel components. See “Configuration Functions for Video Channel Components,” which begins on page 6-61, for information about the configuration functions that work only with video channels. See “Configuration Functions for Sound Channel Components,” which begins on page 6-77, for information about the configuration functions that work only with sound channels.
  10437. The SGSetChannelUsage function specifies how your channel is to be used. The sequence grabber component can restrict a channel to use during record or preview operations. In addition, this function allows the sequence grabber component to specify whether your channel plays during a record operation. The SGGetChannelUsage function allows the sequence grabber component to determine a channel’s usage.
  10438. The SGGetChannelInfo function allows the sequence grabber component to determine some of the characteristics of your channel. For example, this function returns information indicating whether your channel has a visual or an audio representation. 
  10439. The SGSetChannelPlayFlags function lets the sequence grabber component influence the speed and quality with which your channel plays captured data. The SGGetChannelPlayFlags function allows the sequence grabber component to determine these flag settings.
  10440. The SGSetChannelMaxFrames function establishes a limit on the number of frames that your channel component will capture from a channel. 
  10441. The SGGetChannelMaxFrames function enables the sequence grabber component to determine that limit.
  10442. The SGSetChannelRefCon function allows the sequence grabber component to set the value of a reference constant that your component passes to its callback functions (see “Using Callback Functions for Video Channel Components,” which begins on page 6-35, for information about the callback functions that are supported by video channels).
  10443. The SGGetDataRate function allows the sequence grabber component to determine how many bytes of captured data your channel is collecting each second. 
  10444. The SGGetChannelSampleDescription function allows the sequence grabber to retrieve your channel’s sample description. The SGGetChannelTimeScale function allows it to obtain your channel’s time scale.
  10445. The sequence grabber can modify or retrieve your channel’s clipping region by calling the SGSetChannelClip or SGGetChannelClip function, respectively. The sequence grabber can work with your channel’s transformation matrix by calling the SGSetChannelMatrix and SGGetChannelMatrix functions.
  10446. SGSetChannelUsage
  10447.  
  10448. The SGSetChannelUsage function specifies how your channel is to be used by the sequence grabber component. 
  10449. pascal ComponentResult SGSetChannelUsage (SGChannel c, 
  10450.                                                         long usage);
  10451. c    Identifies the channel connection for this operation. 
  10452. usage    Contains flags specifying how your channel is to be used. The sequence grabber component may set more than one of these flags to 1. It sets unused flags to 0. The following flags are defined by the SeqGrabUsageEnum data type:
  10453. seqGrabRecord
  10454. Indicates that your channel is to be used during record operations. The sequence grabber component sets this flag to 1 to use a channel for recording.
  10455. seqGrabPreview
  10456. Indicates that your channel is to be used during preview operations. The sequence grabber component sets this flag to 1 to use a channel for previewing.
  10457. seqGrabPlayDuringRecord
  10458. Indicates that your component is to play its captured data during a record operation. If the sequence grabber component sets this flag to 1, your channel should play its captured data during a record operation, if the destination buffer is onscreen. 
  10459. DESCRIPTION
  10460. The sequence grabber component can specify that a channel is to be used for recording or previewing, or both. In addition, the sequence grabber component can control whether the data captured by a channel is displayed during the record or preview operation.
  10461. RESULT CODESnotEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  10462. deviceCantMeetRequest    –9408    Device cannot support grabber    
  10463.  
  10464. SGGetChannelUsage
  10465.  
  10466. The SGGetChannelUsage function allows the sequence grabber to determine how your channel is to be used. 
  10467. pascal ComponentResult SGGetChannelUsage (SGChannel c, 
  10468.                                                         long *usage);
  10469. c    Identifies the channel connection for this operation. 
  10470. usage    Contains a pointer to a location that is to receive flags specifying how your channel is to be used. You may set more than one of these flags to 1. Set unused flags to 0. The following flags are defined by the SeqGrabUsageEnum data type:
  10471. seqGrabRecord
  10472. Indicates that your channel is to be used during record operations. Set this flag to 1 if your channel is being used for recording.
  10473. seqGrabPreview
  10474. Indicates that your channel is to be used during preview operations. Set this flag to 1 if your channel is being used for previewing.
  10475. seqGrabPlayDuringRecord
  10476. Indicates that your component is to play its captured data during a record operation. Set this flag to 1 if your channel plays its captured data during a record operation. 
  10477. SEE ALSO        
  10478. The sequence grabber component establishes your channel’s usage by calling your SGSetChannelUsage function, described in the previous section.
  10479. SGGetChannelInfo
  10480.  
  10481. The SGGetChannelInfo function allows the sequence grabber to determine how a channel’s data is represented to the user—as visual or audio data, or both.
  10482. pascal ComponentResult SGGetChannelInfo (SGChannel c,
  10483.                                                          long *channelInfo);
  10484. c    Identifies the channel connection for this operation. 
  10485. channelInfo
  10486. Contains a pointer to a long integer that is to receive channel information flags. You may set more than one flag to 1. Set unused flags to 0. The following flags are defined:
  10487. seqGrabHasBounds
  10488. Indicates that your channel has a visual representation. If you set this flag to 1, the channel has a visual representation. The sequence grabber component may call your SGSetChannelBounds function (described on page 6-63).
  10489. seqGrabHasVolume
  10490. Indicates that your channel has an audio representation. If you set this flag to 1, the channel has an audio representation. The sequence grabber component may call your SGSetChannelVolume function (described on page 6-77).
  10491. seqGrabHasDiscreteSamples
  10492. Indicates that the data captured by your channel component is organized into discrete frames. If you set this flag to 1, the sequence grabber component may use the SGSetChannelMaxFrames function (described on page 6-52) to limit the number of frames processed in a record operation or the rate at which those frames are processed. If your channel’s data is not organized into frames, set this flag to 0. 
  10493. SGSetChannelPlayFlags
  10494.  
  10495. The SGSetChannelPlayFlags function allows the sequence grabber component to influence the speed and quality with which your channel component displays data from its source. 
  10496. pascal ComponentResult SGSetChannelPlayFlags (SGChannel c, 
  10497.                                                              long playFlags);
  10498. c    Identifies the channel connection for this operation. 
  10499. playFlags    Specifies a long integer that contains flags and values that influence channel playback. The following values are defined—the sequence grabber component must use one of these values:
  10500. channelPlayNormal    
  10501. Instructs your channel component to use its default playback methodology. 
  10502. channelPlayFast     
  10503. Instructs your channel component to sacrifice playback quality in order to achieve the specified playback rate. 
  10504. channelPlayHighQuality 
  10505. Instructs your channel component to play the channel’s data at the highest possible quality—this option sacrifices playback rate for the sake of image quality. This option may reduce the amount of processor time available to other programs in the computer. This option should not affect the quality of the recorded data, however.
  10506.     The following flag is defined—the sequence grabber component may use this flag with any of the values defined for this parameter (unused flags are set to 0):
  10507. channelPlayAllData
  10508. Instructs your channel component to try to play all of the data it captures, even the data that is stored in offscreen buffers. This option is useful when you want to be sure that the user sees as much of the captured data as possible. The sequence grabber component sets this flag to 1 to play all the captured data. The sequence grabber component may combine this flag with any of the values defined for the playFlags parameter.
  10509. DESCRIPTION
  10510. The SGSetChannelPlayFlags function should not affect the quality of a record operation.
  10511. SGGetChannelPlayFlags
  10512.  
  10513. The SGGetChannelPlayFlags function allows the sequence grabber component to retrieve the playback control flags that it set with the SGSetChannelPlayFlags function, which is described in the previous section.
  10514. pascal ComponentResult SGGetChannelPlayFlags (SGChannel c, 
  10515.                                                              long *playFlags);
  10516. c    Identifies the channel connection for this operation. 
  10517. playFlags    Contains a pointer to a long integer that is to receive flags and values that influence channel playback. The following values are defined:
  10518. channelPlayNormal    
  10519. Your channel component uses its default playback methodology. 
  10520. channelPlayFast     
  10521. Your channel component sacrifices playback quality in order to achieve the specified playback rate. 
  10522. channelPlayHighQuality 
  10523. Your channel component plays the channel’s data at the highest possible quality—this option sacrifices playback rate for the sake of image quality. This option may reduce the amount of processor time available to other programs in the computer. This option should not affect the quality of the recorded data, however.
  10524.     The following flag is defined—this flag may be used with any of the values defined for this parameter (unused flags are set to 0):
  10525. channelPlayAllData
  10526. Your channel component tries to play all of the data it captures, even the data that is stored in offscreen buffers. This option is useful when you want to be sure that the user sees as much of the captured data as possible. The sequence grabber component sets this flag to 1 to play all the captured data. The sequence grabber component may combine this flag with any of the values defined for the playFlags parameter.
  10527. SGSetChannelMaxFrames
  10528.  
  10529. The SGSetChannelMaxFrames function allows the sequence grabber to limit the number of frames that your channel component will capture during a record operation. 
  10530. pascal ComponentResult SGSetChannelMaxFrames (SGChannel c, 
  10531.                                                              long frameCount);
  10532. c    Identifies the channel connection for this operation. 
  10533. frameCount
  10534. Specifies the maximum number of frames to capture during the preview or record operation. The sequence grabber component sets this parameter to –1 to remove the limit.
  10535. DESCRIPTION
  10536. The SGSetChannelMaxFrames function works only with channels that have data that is organized into frames, such as video data from a video disc. 
  10537. RESULT CODESparamErr    –50    Invalid parameter specified    
  10538. cantDoThatInCurrentMode    –9402    Request invalid in current mode    
  10539.  
  10540. SEE ALSO
  10541. You report whether your channel’s data is organized into frames in your response to the SGGetChannelInfo function, which is described on page 6-49.
  10542. SGGetChannelMaxFrames
  10543.  
  10544. The SGGetChannelMaxFrames function allows the sequence grabber component to determine the number of frames left to be captured from your channel. 
  10545. pascal ComponentResult SGGetChannelMaxFrames (SGChannel c, 
  10546.                                                              long *frameCount);
  10547. c    Identifies the channel connection for this operation. 
  10548. frameCount
  10549. Contains a pointer to a long integer that is to receive a value specifying the number of frames left to be captured during the preview or record operation. If the returned value is –1, the sequence grabber channel component captures as many frames as it can.
  10550. RESULT CODEseqGrabInfoNotAvailable    –9407    Channel component cannot support request    
  10551.  
  10552. SEE ALSO
  10553. The sequence grabber component sets the starting value by calling the SGSetChannelMaxFrames function, which is described in the previous section.
  10554. SGSetChannelRefCon
  10555.  
  10556. The SGSetChannelRefCon function allows the sequence grabber component to set the value of a reference constant that your component passes to its callback functions. 
  10557. pascal ComponentResult SGSetChannelRefCon (SGChannel c, 
  10558.                                                          long refCon);
  10559. c    Identifies the channel connection for this operation. 
  10560. refCon    Specifies a reference constant value that your component should pass to the callback functions that have been assigned to this channel. 
  10561. DESCRIPTION
  10562.  Sound channels do not support callback functions.
  10563. SEE ALSO
  10564. See “Using Callback Functions for Video Channel Components,” which begins on page 6-36, for a description of the callback functions that are supported by video channel components.
  10565. SGGetDataRate
  10566.  
  10567. The sequence grabber component calls your component’s SGGetDataRate function in order to determine how much recording time is left. The sequence grabber calls your component when an application calls the sequence grabber component’s SGGetTimeRemaining function (see the chapter “Sequence Grabber Components” in this book for details). 
  10568. pascal ComponentResult SGGetDataRate (SGChannel c, 
  10569.                                                     long *bytesPerSecond);
  10570. c    Identifies the channel connection for this operation. 
  10571. bytesPerSecond
  10572. Contains a pointer to a long integer that is to receive a value indicating the number of bytes your component is recording per second. Your component calculates this value based on its current operational parameters.
  10573. DESCRIPTION
  10574. Your component should calculate and return a value indicating the number of bytes of data your component is recording per second. The sequence grabber component uses this information, along with similar information gathered from other channels being used in the recording operation, to determine how many seconds of data may be recorded given the amount of space remaining.
  10575. SPECIAL CONSIDERATIONS
  10576. The sequence grabber component calls the SGGetDataRate function during the recording operation. Consequently, your component should service the request as quickly as possible.
  10577. SGGetChannelSampleDescription
  10578.  
  10579. The SGGetChannelSampleDescription function allows the sequence grabber to retrieve your channel’s sample description.
  10580. pascal ComponentResult SGGetChannelSampleDescription 
  10581.                                             (SGChannel c, Handle sampleDesc);
  10582. c    Identifies the channel connection for this operation. 
  10583. sampleDesc
  10584. Specifies a handle that is to receive your sample description.
  10585. DESCRIPTION
  10586. The SGGetChannelSampleDescription function allows the sequence grabber to retrieve your channel’s current sample description. The sequence grabber may call this function only when your channel is prepared to record or is actually recording.
  10587. Your channel returns a sample description that is appropriate to the type of data being captured. For video channels, your channel component returns an Image Compression Manager image description structure; for sound channels, you return a sound description structure, as defined by the Movie Toolbox.
  10588. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  10589.  
  10590. SGGetChannelTimeScale
  10591.  
  10592. The SGGetChannelTimeScale function allows the sequence grabber to retrieve your channel’s time scale.
  10593. pascal ComponentResult SGGetChannelTimeScale (SGChannel c,
  10594.                                                              TimeScale *scale);
  10595. c    Identifies the channel connection for this operation. 
  10596. scale    Contains a pointer to a time scale structure. Your channel component places information about its time scale into this structure.
  10597. DESCRIPTION
  10598. The time scale you return typically corresponds to the time scale of the media that has been created by your channel. Applications may use this time scale in their data functions (see the chapter “Sequence Grabber Components” in this book for more information about application-defined data functions).
  10599. SGSetChannelClip
  10600.  
  10601. The SGSetChannelClip function allows the sequence grabber to set your channel’s clipping region.
  10602. pascal ComponentResult SGSetChannelClip (SGChannel c, 
  10603.                                                          RgnHandle theClip);
  10604. c    Identifies the channel connection for this operation. 
  10605. theClip    Contains a handle to the new clipping region. You should make a copy of this region; the application may dispose of the region immediately. 
  10606.     If this parameter is set to nil, remove the current clipping region. 
  10607. DESCRIPTION
  10608. The SGSetChannelClip function allows the sequence grabber to apply a clipping region to your channel’s display region. By default, channel components do not apply a clipping region to their displayed image. 
  10609. SGGetChannelClip
  10610.  
  10611. The SGGetChannelClip function allows the sequence grabber to retrieve your channel’s clipping region.
  10612. pascal ComponentResult SGGetChannelClip (SGChannel c, 
  10613.                                                         RgnHandle *theClip);
  10614. c    Identifies the channel connection for this operation. 
  10615. theClip    Contains a pointer to a handle that is to receive the clipping region. The application is responsible for disposing of this handle. If there is no clipping region, set this handle to nil. 
  10616. Note
  10617. Some devices may not support clipping.u
  10618. SGSetChannelMatrix
  10619.  
  10620. The SGSetChannelMatrix function allows the sequence grabber to set your channel’s display transformation matrix.
  10621. pascal ComponentResult SGSetChannelMatrix (SGChannel c, 
  10622.                                                         const MatrixRecord *m);
  10623. c    Identifies the channel connection for this operation. 
  10624. m    Contains a pointer to a matrix structure, as defined by the Movie Toolbox (see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for more information about matrix structures). This parameter is set to nil to select the identity matrix.
  10625. DESCRIPTION
  10626. The SGSetChannelMatrix function allows the sequence grabber to specify a display transformation matrix for a video channel. Your channel uses this matrix to transform its video image into the destination window. If your channel cannot accommodate the matrix, return an appropriate result code. Note that the sequence grabber may not call this function when you are recording.
  10627. Other channel component functions may affect this matrix. The SGSetChannelBounds function sets the matrix values so that the matrix maps the channel’s output to the channel’s boundary rectangle (described on page 6-63). The SGSetVideoRect function modifies the matrix so that the specified video rectangle appears in the existing destination rectangle (see page 6-64 for more information about the SGSetVideoRect function).
  10628. RESULT CODESmatrixErr    –2203    Invalid matrix    
  10629. deviceCantMeetRequest    –9408    Device cannot support grabber    
  10630.  
  10631. SEE ALSO
  10632. The sequence grabber may retrieve your channel’s matrix by calling the SGGetChannelMatrix function, which is discussed next.
  10633. SGGetChannelMatrix
  10634.  
  10635. The SGGetChannelMatrix function allows the sequence grabber to retrieve your channel’s display transformation matrix.
  10636. pascal ComponentResult SGGetChannelMatrix (SGChannel c,
  10637.                                                          MatrixRecord *m);
  10638. c    Identifies the channel connection for this operation. 
  10639. m    Contains a pointer to a matrix structure, as defined by the Movie Toolbox (see “Movie Toolbox” in Inside Macintosh: QuickTime for more information about matrix structures). Place your current matrix values into this matrix structure.
  10640. SEE ALSO
  10641. The sequence grabber may set your channel’s matrix by calling the SGSetChannelMatrix function, which is discussed in the previous section.
  10642. Working With Channel Devices
  10643.  
  10644. Sequence grabbers provide a number of functions that allow applications to determine the devices that can be, or the device that is, attached to a given sequence grabber channel. These devices, in turn, allow the channel component to control the digitizing equipment. For example, video channels use video digitizer components, and sound channels use sound input drivers. Applications can use these functions to present a list of available devices to the user, allowing the user to select a specific device for each channel. The sequence grabber passes these functions on to your channel component.
  10645. The sequence grabber may use the SGGetChannelDeviceList function to retrieve a list of devices that may be used by your channel. 
  10646. The sequence grabber can use the SGSetChannelDevice function to assign a device to your channel.
  10647. The SGGetChannelDeviceList function uses a device list structure to pass information about one or more channel devices. The SGDeviceListRecord data type defines the format of the device list structure.
  10648. typedef struct SGDeviceListRecord {
  10649.     short                    count;                        /* count of devices */
  10650.     short                    selectedIndex;                        /* current device */
  10651.     long                    reserved;                        /* set to 0 */
  10652.     SGDeviceName                    entry[1];                        /* device names */
  10653. } SGDeviceListRecord, *SGDeviceListPtr, **SGDeviceList;
  10654. Field descriptions
  10655. Field descriptions
  10656. count    Indicates the number of devices described by this structure. The value of this field corresponds to the number of entries in the device name array defined by the entry field.
  10657. selectedIndex    
  10658. Identifies the currently active device. The value of this field corresponds to the appropriate entry in the device name array defined by the entry field. Note that this value is 0-relative; that is, the first entry has an index number of 0, the second’s value is 1, and so on.
  10659. reserved    Reserved for Apple. Always set to 0.
  10660. entry    Contains an array of device name structures. Each structure corresponds to one valid device. The count field indicates the number of entries in this array. The SGDeviceName data type defines the format of a device name structure; this data type is discussed next.
  10661. Device list structures contain an array of device name structures. Each device name structure identifies a single device that may be used by the channel. The SGDeviceName data type defines the format of a device name structure.
  10662. typedef struct SGDeviceName {    
  10663.     Str63                name;                        /* device name */
  10664.     Handle                icon;                        /* device icon */
  10665.     long                flags;                        /* flags */
  10666.     long                refCon;                        /* set to 0 */
  10667.     long                reserved;                        /* set to 0 */
  10668. } SGDeviceName;
  10669. Field descriptions
  10670. name    Contains the name of the device. For video digitizer components, this field contains the component’s name as specified in the component resource. For sound input drivers, this field contains the driver name. 
  10671. icon    Contains a handle to the device’s icon. Some devices may support an icon, which applications may choose to present to the user. If the device does not support an icon, or if the sequence grabber chooses not to retrieve this information (by setting the sgDeviceListWithIcons flag to 0 when it calls the SGGetChannelDeviceList function, which is described in the next section), set this field to nil.
  10672. flags    Reflects the current status of the device. The following flag is defined:
  10673. sgDeviceNameFlagDeviceUnavailable
  10674. When set to 1, this flag indicates that this device is not currently available.
  10675. refCon    Reserved for Apple. Always set to 0.
  10676. reserved    Reserved for Apple. Always set to 0.
  10677. SGGetChannelDeviceList
  10678.  
  10679. The SGGetChannelDeviceList function allows the sequence grabber to retrieve a list of the devices that are valid for your channel.
  10680. pascal ComponentResult SGGetChannelDeviceList (SGChannel c, 
  10681.                                                             long selectionFlags, 
  10682.                                                             SGDeviceList *list);
  10683. c    Identifies the channel connection for this operation. 
  10684. selectionFlags    
  10685. Controls the data you are to return for each device. The following flags are defined:
  10686. sgDeviceListWithIcons
  10687. Specifies whether the sequence grabber wants to retrieve an icon for each device. If this flag is set to 1, return an icon for each device in the list, in the icon field. If this flag is set to 0, set the icon field to 0.
  10688. sgDeviceListDontCheckAvailability
  10689. Controls whether you verify that each device is 
  10690. currently available. If this flag is set to 1, do not 
  10691. check the availability of each device. Otherwise, you should check each device’s availability, and set the sgDeviceNameFlagDeviceUnavailable flag appropriately in each device name structure that you return.
  10692. list    Contains a pointer to a device list structure pointer. The channel creates a device name structure and returns a pointer to that structure in the field referred to by this parameter. Applications use the sequence grabber’s SGDisposeDeviceList function to dispose of the memory used by 
  10693. the list.
  10694. DESCRIPTION
  10695. This function allows the sequence grabber to retrieve a list of the devices that may be used by your channel. Each entry in this list identifies a valid device by name. Applications may then place these device names into a menu using the sequence grabber’s SGAppendDeviceListToMenu function.
  10696. Applications may use this function in order to determine the device your channel is currently using. Be sure to set the selectedIndex field properly.
  10697. RESULT CODES
  10698. Memory Manager errors
  10699. SEE ALSO
  10700. You may use the sequence grabber’s SGSortDeviceList function to sort the entries 
  10701. in your device list structure. This function is discussed on page 6-89.
  10702. SGSetChannelDevice
  10703.  
  10704. The SGSetChannelDevice function allows the sequence grabber to assign a device to your channel.
  10705. pascal ComponentResult SGSetChannelDevice (SGChannel c, 
  10706.                                                          StringPtr name);
  10707. c    Identifies the channel connection for this operation. 
  10708. name    Contains a pointer to the device’s name string. This name is contained in the name field of the appropriate device name structure in the device list that your channel returns to the SGGetChannelDeviceList function.
  10709. DESCRIPTION
  10710. When the sequence grabber calls your SGSetChannelDevice function, your channel should try to use the specified device instead of the device currently in use. The device name must be derived from your channel’s device list.
  10711. RESULT CODESparamErr    –50    Invalid parameter value    
  10712. deviceCantMeetRequest    –9408    Device cannot support grabber    
  10713.  
  10714. SEE ALSO
  10715. The sequence grabber obtains the device list by calling your SGGetChannelDeviceList function, which is discussed in the previous section.
  10716. Configuration Functions for Video Channel Components
  10717.  
  10718. Video channel components provide a number of functions that allow the sequence grabber to configure the channel’s video characteristics. This section describes these video channel configuration functions, which the sequence grabber component uses only with video channels. 
  10719. The SGSetChannelBounds function allows the sequence grabber to set the display boundary rectangle for a video channel. The SGGetChannelBounds function determines a channel’s boundary rectangle.
  10720. The sequence grabber component uses the SGGetSrcVideoBounds function to determine the coordinates of the source video boundary rectangle. This rectangle defines the size of the source video image being captured by a video channel. The SGSetVideoRect function specifies a part of the source video boundary rectangle to be captured by the channel. The SGGetVideoRect function retrieves this active source video rectangle.
  10721. Typically, video channel components use the Image Compression Manager to 
  10722. compress the video data they capture. The sequence grabber component can control many aspects of this image-compression process. The SGSetVideoCompressorType function specifies the type of image compressor to use. The sequence grabber 
  10723. can determine the type of image compressor currently in use by calling the SGGetVideoCompressorType function. The sequence grabber component can specify a particular image compressor and set many image-compression parameters by calling the SGSetVideoCompressor function. The sequence grabber component can determine which image compressor is being used and its parameter settings by calling the SGGetVideoCompressor function.
  10724. Video channel components typically work with a video digitizer component (see the chapter “Video Digitizer Components” in this book for a complete description of video digitizer components). Sequence grabber components provide functions that allow an application to work with a channel’s video digitizer component. Video channel components, in turn, must provide support for these functions. The sequence 
  10725. grabber component uses the SGGetVideoDigitizerComponent function to determine which video digitizer component is supplying data to your video 
  10726. channel component. The sequence grabber component sets a channel’s video digitizer component by calling the SGSetVideoDigitizerComponent function. If an application changes any video digitizer settings by calling the video digitizer component directly, the sequence grabber component informs your video channel component by calling the SGVideoDigitizerChanged function.
  10727. Some video source data may contain unacceptable levels of visual noise or artifacts. One technique for removing this noise is to capture the image and then reduce it in size. During the size reduction process, the noise can be filtered out. Some video channel components may provide functions that allow the sequence grabber component to filter the input video data. The SGSetCompressBuffer function sets a filter buffer for a video channel. The SGGetCompressBuffer function returns information about your filter buffer.
  10728. The sequence grabber can work with a video channel’s frame rate by calling the SGSetFrameRate and SGGetFrameRate functions. The sequence grabber can control whether your channel uses an offscreen buffer by calling your SGSetUseScreenBuffer and SGGetUseScreenBuffer functions.
  10729. Your SGAlignChannelRect function allows the sequence grabber to determine a channel’s optimum screen position.
  10730. SGSetChannelBounds
  10731.  
  10732. The SGSetChannelBounds function allows the sequence grabber component to specify your channel’s display boundary rectangle. 
  10733. pascal ComponentResult SGSetChannelBounds (SGChannel c,
  10734.                                                          Rect *bounds);
  10735. c    Identifies the channel connection for this operation. 
  10736. bounds    Contains a pointer to a rectangle that defines your channel’s display boundary rectangle.
  10737. DESCRIPTION
  10738. This rectangle defines the destination for data from this channel. This rectangle is defined in the graphics world that the sequence grabber component establishes by calling the SGSetGWorld function, described on page 6-39.
  10739. SPECIAL CONSIDERATIONS
  10740. The SGSetChannelBounds function adjusts the channel matrix, as appropriate.
  10741. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  10742. notEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  10743. deviceCantMeetRequest    –9408    Device cannot support grabber    
  10744.  
  10745. SGGetChannelBounds
  10746.  
  10747. The SGGetChannelBounds function allows the sequence grabber component to determine your channel’s display boundary rectangle.
  10748. pascal ComponentResult SGGetChannelBounds (SGChannel c, 
  10749.                                                             const Rect *bounds);
  10750. c    Identifies the channel connection for this operation. 
  10751. bounds    Contains a pointer to a rectangle structure that is to receive information about your channel’s display boundary rectangle.
  10752. DESCRIPTION
  10753. The sequence grabber component sets the boundary rectangle by calling the SGSetChannelBounds function, which is described in the previous section. This rectangle is defined in the graphics world that the sequence grabber establishes by calling the SGSetGWorld function, described on page 6-39.
  10754. SGGetSrcVideoBounds
  10755.  
  10756. The SGGetSrcVideoBounds function allows the sequence grabber component to determine the size of the source video boundary rectangle. 
  10757. pascal ComponentResult SGGetSrcVideoBounds (SGChannel c, Rect *r);
  10758. c    Identifies the channel connection for this operation. 
  10759. r    Contains a pointer to a rectangle structure that is to receive information about your channel’s source video boundary rectangle.
  10760. DESCRIPTION
  10761. This rectangle defines the size of the source video image. 
  10762. RESULT CODEparamErr    –50    Invalid parameter specified    
  10763.  
  10764. SEE ALSO
  10765. For video channel components that work with video digitizer components, this rectangle corresponds to the video digitizer’s active source rectangle (see the chapter “Video Digitizer Components” in this book for more information about video digitizer components).
  10766. SGSetVideoRect
  10767.  
  10768. The SGSetVideoRect function allows the sequence grabber component to specify a part of the source video image that is to be captured by your channel component. 
  10769. pascal ComponentResult SGSetVideoRect (SGChannel c, Rect *r);
  10770. c    Identifies the channel connection for this operation. 
  10771. r    Contains a pointer to the dimensions of the rectangle that defines the portion of the source video image to be captured. This rectangle must lie within the boundaries of the source video boundary rectangle, which the sequence grabber can obtain by calling the SGGetSrcVideoBounds function, described in the previous section.
  10772. DESCRIPTION
  10773. This rectangle must reside within the boundaries of the source video boundary rectangle. The sequence grabber component obtains the dimensions of the source video boundary rectangle by calling the SGGetSrcVideoBounds function. By default, your component should capture the entire video image, as defined by the source video boundary rectangle.
  10774. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  10775. notEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  10776. deviceCantMeetRequest    –9408    Device cannot support grabber    
  10777.  
  10778. SEE ALSO
  10779. For video channel components that receive their data from video digitizer components, this function sets the video digitizer component’s digitizer rectangle. See the chapter “Video Digitizer Components” in this book for information about video digitizer components.
  10780. SGGetVideoRect
  10781.  
  10782. The SGGetVideoRect function allows the sequence grabber to determine the portion of the source video image that your component is going to capture. 
  10783. pascal ComponentResult SGGetVideoRect (SGChannel c, Rect *r);
  10784. c    Contains a pointer to the channel connection for this operation.
  10785. r    Contains a pointer to a rectangle structure that is to receive the dimensions of the rectangle that defines the portion of the source video image your component is going to capture.
  10786. SEE ALSO
  10787. The sequence grabber uses the SGSetVideoRect function, which is described in the previous section, to set the dimensions of this rectangle.
  10788. SGSetVideoCompressorType
  10789.  
  10790. The SGSetVideoCompressorType function allows the sequence grabber component to specify the type of image compression your component is to apply to the captured video images. 
  10791. pascal ComponentResult SGSetVideoCompressorType (SGChannel c, 
  10792.                                                         OSType compressorType);
  10793. c    Identifies the channel connection for this operation. 
  10794. compressorType
  10795. Specifies the type of image compression to use. The value of this parameter must correspond to one of the image compressor types supported by the Image Compression Manager. Currently, six CodecType values are provided by Apple. You should use the GetCodecNameList function to retrieve these names, so that your application can take advantage of new compressor types that may be added in the future. For each CodecType value in the following list, the corresponding compression method is also identified by its text 
  10796. string name. 
  10797.     Compressor type    Compressor name    
  10798.     'rpza'    video compressor    
  10799.     'jpeg'    photo compressor    
  10800.     'rle '    animation compressor     
  10801.     'raw '    raw compressor    
  10802.     'smc '    graphics compressor    
  10803.     'cvid'    compact video compressor    
  10804.  
  10805.     See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for information about valid compressor types. If this value is set to 0, its default compression type is selected.
  10806. DESCRIPTION
  10807. In addition, your component should reset all image-compression parameters 
  10808. to their default values. The sequence grabber component can then use the SGSetVideoCompressor function, described on page 6-68, to change those compression parameters.
  10809. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  10810. notEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  10811. deviceCantMeetRequest    –9408    Device cannot support grabber    
  10812.  
  10813. SGGetVideoCompressorType
  10814.  
  10815. The SGGetVideoCompressorType function allows the sequence grabber component to determine the type of image compression that is being applied to your channel’s 
  10816. video data. 
  10817. pascal ComponentResult SGGetVideoCompressorType (SGChannel c, 
  10818.                                                         OSType *compressorType);
  10819. c    Identifies the channel connection for this operation. 
  10820. compressorType
  10821. Contains a pointer to an OSType field that is to receive information about the type of image compression to use. Return a value that corresponds to one of the image-compression types supported by the Image Compression Manager. Currently, six CodecType values are provided by Apple. You should use the GetCodecNameList function to retrieve these names, so that your application can take advantage of new compressor types that may be added in the future. For each CodecType value in the following list, the corresponding compression method is also identified by its text string name.
  10822.     Compressor type    Compressor name    
  10823.     'rpza'    video compressor    
  10824.     'jpeg'    photo compressor    
  10825.     'rle '    animation compressor    
  10826.     'raw '    raw compressor    
  10827.     'smc '    graphics compressor    
  10828.     'cvid'    compact video compressor    
  10829.  
  10830.     See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for information about valid compressor types. If this value is set to 0, its default compression type is selected.
  10831. SEE ALSO
  10832. The sequence grabber component can set the image-compression type by calling the SGSetVideoCompressorType function, which is described in the previous section.
  10833. SGSetVideoCompressor
  10834.  
  10835. The SGSetVideoCompressor function allows the sequence grabber component to specify many of the parameters that control image compression of the video data captured by your video channel.
  10836. pascal ComponentResult SGSetVideoCompressor (SGChannel c, 
  10837.                                             short depth,
  10838.                                             CompressorComponent compressor,
  10839.                                             CodecQ spatialQuality, 
  10840.                                             CodecQ temporalQuality, 
  10841.                                             long keyFrameRate);
  10842. c    Identifies the channel connection for this operation. 
  10843. depth    Specifies the depth at which the image is likely to be viewed. Image compressors may use this as an indication of the color or grayscale resolution of the compressed images. If the sequence grabber component sets this parameter to 0, let the sequence grabber component determine the appropriate value for the source image. Values of 1, 2, 4, 8, 16, 24, and 32 indicate the number of bits per pixel for color images. Values of 33, 34, 36, and 40 indicate 1-bit, 2-bit, 4-bit, and 8-bit grayscale, respectively, for grayscale images. Your component can determine which depths are supported by a given compressor by examining the compression information record (defined by the CodecInfo data type) returned by the Image Compression Manager’s GetCodecInfo function (see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information on the GetCodecInfo function).
  10844. compressor
  10845. Specifies the image compressor identifier. The sequence grabber component may specify a particular compressor by setting this parameter to its compressor identifier. You can obtain these identifiers from the Image Compression Manager’s GetCodecNameList function.
  10846. spatialQuality
  10847. Specifies the desired quality of the compressed image. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for valid values. 
  10848. temporalQuality
  10849. Specifies the desired temporal quality of the sequence. This parameter governs the level of compression the sequence grabber component desires with respect to information in successive frames in the sequence. The sequence grabber component sets this parameter to 0 to prevent the image compressor from applying temporal compression to the sequence. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for other valid values.
  10850. keyFrameRate
  10851. Specifies the maximum number of frames allowed between key frames. Key frames provide points from which a temporally compressed sequence may be decompressed. The sequence grabber component uses this parameter to control the frequency with which the image compressor places key frames into the compressed sequence. For more information about key frames, see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime.
  10852.     The compressor determines the optimum placement for key frames based upon the amount of redundancy between adjacent images in the sequence. Consequently, the compressor may insert key frames more frequently than you have requested. However, the compressor will never place key frames less often than is indicated by the setting of the keyFrameRate parameter. The compressor ignores this parameter if you have not requested temporal compression (that is, you have set the temporalQuality parameter to 0). 
  10853. RESULT CODESparamErr    –50    Invalid parameter    
  10854. cantDoThatInCurrentMode    –9402    Request invalid in current mode    
  10855. notEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  10856. deviceCantMeetRequest    –9408    Device cannot support grabber    
  10857.  
  10858. SGGetVideoCompressor
  10859.  
  10860. The SGGetVideoCompressor function allows the sequence grabber component to determine your channel’s current image-compression parameters. 
  10861. pascal ComponentResult SGGetVideoCompressor (SGChannel c,
  10862.                                             short *depth, 
  10863.                                             CompressorComponent *compressor,                     
  10864.                                             CodecQ *spatialQuality, 
  10865.                                             CodecQ *temporalQuality, 
  10866.                                             long *keyFrameRate);
  10867. c    Identifies the channel connection for this operation. 
  10868. depth    Contains a pointer to a field that is to receive the depth at which the image is likely to be viewed. Image compressor components may use the depth as an indication of the color or grayscale resolution of the compressed images. Return the depth value currently in use by your channel component. If this parameter is set to nil, the sequence grabber component is not interested in this information.
  10869. compressor
  10870. Contains a pointer to a field that is to receive an image compressor identifier. Return the identifier that corresponds to the image compressor your channel is using. If this parameter is set to nil, the sequence grabber component is not interested in this information.
  10871. spatialQuality
  10872. Contains a pointer to a field that is to receive the desired compressed image quality. Return the current quality value. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for valid values. If this parameter is set to nil, the sequence grabber component is not interested in this information.
  10873. temporalQuality
  10874. Contains a pointer to a field that is to receive the desired temporal quality of the sequence. This parameter governs the level of compression you desire with respect to information between successive frames in the sequence. Return the current temporal quality value. If this parameter is set to nil, the sequence grabber component is not interested in this information.
  10875. keyFrameRate
  10876. Contains a pointer to a field that is to receive the maximum number of frames allowed between key frames. Key frames provide points from which a temporally compressed sequence may be decompressed. This value controls the frequency at which the image compressor places key frames into the compressed sequence. Return the current key frame rate. If this parameter is set to nil, the sequence grabber component is not interested in this information. 
  10877. SEE ALSO
  10878. The sequence grabber component can set these parameters by calling the SGSetVideoCompressor function, which is described in the previous section.
  10879. SGSetVideoDigitizerComponent
  10880.  
  10881. The SGSetVideoDigitizerComponent function allows the sequence grabber component to assign a video digitizer component to your video channel. 
  10882. pascal ComponentResult SGSetVideoDigitizerComponent 
  10883.                                     (SGChannel c, ComponentInstance vdig);
  10884. c    Identifies the channel connection for this operation. 
  10885. vdig    Contains a component instance that identifies a connection to a video digitizer component. Your video channel component should use this video digitizer component to obtain its source video data.
  10886. DESCRIPTION
  10887. Typically, your video channel component locates its own video digitizer component. The sequence grabber component calls the SGSetVideoDigitizerComponent function if an application chooses to assign a video digitizer to a video channel.
  10888. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  10889.  
  10890. SGGetVideoDigitizerComponent
  10891.  
  10892. The SGGetVideoDigitizerComponent function allows the sequence grabber component to determine the video digitizer component that is providing source video to your video channel component. For example, the sequence grabber component can use this function to obtain access to the video digitizer component so that the 
  10893. grabber component can set the digitizer’s parameters. See the chapter “Video Digitizer Components” in this book for information about video digitizer components.
  10894. pascal ComponentInstance SGGetVideoDigitizerComponent 
  10895.                                                                     (SGChannel c);
  10896. c    Identifies the channel connection for this operation. 
  10897. DESCRIPTION
  10898. The SGGetVideoDigitizerComponent function returns a component instance that identifies the connection between your video channel component and its video digitizer component. If your video channel component does not use a video digitizer component, set this returned value to nil.
  10899. SEE ALSO
  10900. If the sequence grabber component changes any video digitizer component parameters, it notifies your sequence grabber channel component by calling your SGVideoDigitizerChanged function, which is described in the next section. 
  10901. SGVideoDigitizerChanged
  10902.  
  10903. The SGVideoDigitizerChanged function allows the sequence grabber component to notify your component whenever an application changes the configuration of your video channel’s video digitizer. 
  10904. pascal ComponentResult SGVideoDigitizerChanged (SGChannel c);
  10905. c    Identifies the channel connection for this operation. 
  10906. DESCRIPTION
  10907. You should update any status information you maintain regarding the video digitizer component used by your channel component.
  10908. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  10909.  
  10910. SGSetCompressBuffer
  10911.  
  10912. Some video source data may contain unacceptable levels of visual noise or artifacts. One technique for removing this noise is to capture the image and then reduce it in size. During the size reduction process, the noise can be filtered out. 
  10913. The SGSetCompressBuffer function allows the sequence grabber component to direct your component to create a filter buffer for your video channel. Logically, this buffer sits between the source video buffer and the destination rectangle that the sequence grabber component sets with the SGSetChannelBounds function, described on page 6-63. The filter buffer should be larger than the area enclosed by the destination rectangle. 
  10914. pascal ComponentResult SGSetCompressBuffer (SGChannel c, 
  10915.                                                     short depth, 
  10916.                                                     const Rect *compressSize);
  10917. c    Identifies the channel connection for this operation. 
  10918. depth    Specifies the pixel depth of the filter buffer. If the sequence grabber sets this parameter to 0, use the depth of the video buffer (which the sequence grabber sets with the SGSetChannelBounds function).
  10919. compressSize
  10920. Contains a pointer to the dimensions of the filter buffer. This buffer should be larger than the destination buffer. The sequence grabber component sets this parameter to nil, or it sets the coordinates of this rectangle to 0 (specifying an empty rectangle), to stop filtering the input source video data.
  10921. DESCRIPTION
  10922. If the sequence grabber component establishes a filter buffer for a channel, your channel component should place its captured video image into the filter buffer and then copy the image into the destination buffer. This process may be too slow for some record operations, but it can be useful during controlled record operations (where the source video can be read on a frame-by-frame basis).
  10923. RESULT CODEcantDoThatInCurrentMode    –9402    Request invalid in current mode    
  10924.  
  10925. SGGetCompressBuffer
  10926.  
  10927. The SGGetCompressBuffer function returns information about the filter buffer that the sequence grabber component has established for your video channel.
  10928. pascal ComponentResult SGGetCompressBuffer (SGChannel c, 
  10929.                                                             short *depth, 
  10930.                                                             Rect *compressSize);
  10931. c    Identifies the channel connection for this operation. 
  10932. depth    Contains a pointer to a field that is to receive the pixel depth of the filter buffer. If your component is not filtering the input video data, set the returned value to 0.
  10933. compressSize
  10934. Contains a pointer to a rectangle structure that is to receive the dimensions of the filter buffer. If your component is not filtering the input video data, return an empty rectangle (all coordinates set to 0).
  10935. SEE ALSO
  10936. The sequence grabber component sets a filter buffer by calling the SGSetCompressBuffer function, which is described in the previous section.
  10937. SGSetFrameRate
  10938.  
  10939. The SGSetFrameRate function allows the sequence grabber to specify a video channel’s frame rate for recording.
  10940. pascal ComponentResult SGSetFrameRate (SGChannel c, 
  10941.                                                      Fixed frameRate);
  10942. c    Identifies the channel connection for this operation. 
  10943. frameRate    Specifies the desired frame rate. If this parameter is set to 0, use your channel’s default frame rate. Typically, this corresponds to the fastest rate that your channel can support.
  10944. DESCRIPTION
  10945. The SGSetFrameRate function allows the sequence grabber to control a video channel’s frame rate. Note that the digitizing hardware may not be able to support the full rate that the sequence grabber specifies. If the rate is too high, operate at the highest rate you can support. 
  10946. SPECIAL CONSIDERATIONS
  10947. Note that this function will not be called when you are recording.
  10948. RESULT CODESparamErr    –50    Invalid parameter value    
  10949. cantDoThatInCurrentMode    –9402    Request invalid in current mode    
  10950.  
  10951. SEE ALSO
  10952. The sequence grabber can retrieve your channel’s current frame rate by calling your SGGetFrameRate function, which is described next.
  10953. SGGetFrameRate
  10954.  
  10955. The SGGetFrameRate function allows you to retrieve a video channel’s frame rate for recording.
  10956. pascal ComponentResult SGGetFrameRate (SGChannel c, 
  10957.                                                     Fixed *frameRate);
  10958. c    Identifies the channel connection for this operation. 
  10959. frameRate    Contains a pointer to a field to receive the current frame rate. Return your channel’s current frame rate.
  10960. DESCRIPTION
  10961. The SGGetFrameRate function returns your channel’s current rate. By default, your channel should record at the fastest rate that it can support. In this case, set the field referred to by the frameRate parameter to 0.
  10962. SEE ALSO
  10963. The sequence grabber can set your channel’s frame rate by calling the SGSetFrameRate function, which is described in the previous section.
  10964. SGSetUseScreenBuffer
  10965.  
  10966. The SGSetUseScreenBuffer function allows the sequence grabber to control whether your video channel uses an offscreen buffer.
  10967. pascal ComponentResult SGSetUseScreenBuffer (SGChannel c, 
  10968.                                                     Boolean useScreenBuffer);
  10969. c    Identifies the channel connection for this operation. 
  10970. useScreenBuffer    
  10971. Indicates whether to use an offscreen buffer. If this parameter is set to true, draw directly to the screen. If it is set to false, your channel may use an offscreen buffer. If your channel cannot work with offscreen buffers, ignore this parameter.
  10972. DESCRIPTION
  10973. By default, video channels try to draw directly to the screen. The SGSetUseScreenBuffer function allows the sequence grabber to direct your video channel to draw to an offscreen buffer. If your channel cannot draw offscreen, ignore this function. Note that this function will not be called when you are recording.
  10974. RESULT CODESparamErr    –50    Invalid parameter value    
  10975. cantDoThatInCurrentMode    –9402    Request invalid in current mode    
  10976.  
  10977. SEE ALSO
  10978. The sequence grabber can determine whether it has allowed your channel to draw offscreen by calling your SGGetUseScreenBuffer function, which is described next.
  10979. SGGetUseScreenBuffer
  10980.  
  10981. The SGGetUseScreenBuffer function allows the sequence grabber to determine whether your video channel is allowed to use an offscreen buffer.
  10982. pascal ComponentResult SGGetUseScreenBuffer (SGChannel c, 
  10983.                                                     Boolean *useScreenBuffer);
  10984. c    Identifies the channel connection for this operation. 
  10985. useScreenBuffer
  10986.     Contains a pointer to a Boolean value. Set this field to true if your channel draws directly to the screen. Set it to false if your channel can use an offscreen buffer. If your channel cannot work with offscreen buffers, ignore this value.
  10987. DESCRIPTION
  10988. By default, video channels draw directly to the screen. The sequence grabber can direct a channel to draw to an offscreen buffer by calling your SGSetUseScreenBuffer function. If the channels can work offscreen, it then allocates and draws to an offscreen buffer. 
  10989. SEE ALSO
  10990. You can allow a channel to draw offscreen by calling the SGSetUseScreenBuffer function, which is described in the previous section.
  10991. SGAlignChannelRect
  10992.  
  10993. The sequence grabber calls your SGAlignChannelRect function in order to determine whether your channel prefers to draw at a particular screen location.
  10994. pascal ComponentResult SGAlignChannelRect (SGChannel c, Rect *r);
  10995. c    Identifies the connection to your channel.
  10996. r    Contains a pointer to a rectangle. On entry, this rectangle contains coordinates at which the sequence grabber would like to draw your captured video image. If your component can draw more efficiently or at a higher frame rate at a different location, update the contents of this rectangle to reflect where you would prefer to draw. The rectangle will be passed in with global, not local, coordinates.
  10997. DESCRIPTION
  10998. The sequence grabber uses your SGAlignChannelRect function to determine the best alignment for your captured image.
  10999. RESULT CODEbadComponentSelector    0x80008002    Function not supported    
  11000.  
  11001. Configuration Functions for Sound Channel Components
  11002.  
  11003. Sound channel components provide a number of functions that allow sequence grabber components to configure the component’s sound channel. This section describes these sound channel configuration functions. The sequence grabber component uses these functions only with sound channels. 
  11004. The SGSetChannelVolume function allows the sequence grabber component to 
  11005. control a channel’s sound volume. The sequence grabber component uses the SGGetChannelVolume function to determine a channel’s volume.
  11006. The SGSetSoundInputDriver specifies a channel’s sound input device. The sequence grabber component can determine a channel’s sound input device by calling the SGGetSoundInputDriver function. If an application changes any attributes of the sound input device, the sequence grabber component notifies your sound component by calling the SGSoundInputDriverChanged function. 
  11007. The sequence grabber component can control the amount of sound data your channel works with at one time by calling the SGSetSoundRecordChunkSize function. The sequence grabber component can determine this value by calling the SGGetSoundRecordChunkSize function.
  11008. The sequence grabber component controls the rate at which your sound channel samples the input data by calling the SGSetSoundInputRate function. The sequence grabber component can determine the sample rate by calling the SGGetSoundInputRate function.
  11009. The sequence grabber can control other sound input parameters by using your SGSetSoundInputParameters and SGGetSoundInputParameters functions.
  11010. SGSetChannelVolume
  11011.  
  11012. The SGSetChannelVolume function sets your channel’s sound volume. 
  11013. pascal ComponentResult SGSetChannelVolume (SGChannel c, 
  11014.                                                          short volume);
  11015. c    Identifies the channel connection for this operation. 
  11016. volume    Specifies the volume setting of your channel represented as a 16-bit, fixed-point number. The high-order 8 bits contain the integer part of the value; the low-order 8 bits contain the fractional part. Volume values range from –1.0 to 1.0. Negative values play no sound but preserve the absolute value of the volume setting.
  11017. DESCRIPTION
  11018. Use this volume setting during playback—this setting should not affect the record level or the volume of the track in the recorded QuickTime movie.
  11019. SGGetChannelVolume
  11020.  
  11021. The SGGetChannelVolume function allows the sequence grabber component to determine your channel’s sound volume setting. 
  11022. pascal ComponentResult SGGetChannelVolume (SGChannel c,
  11023.                                                          short *volume);
  11024. c    Identifies the channel connection for this operation. 
  11025. volume    Contains a pointer to an integer that is to receive the volume setting of the channel represented as a 16-bit, fixed-point number. The high-order 8 bits contain the integer part of the value; the low-order 8 bits contain the fractional part. Volume values range from –1.0 to 1.0. Negative values play no sound but preserve the absolute value of the volume setting.
  11026. SEE ALSO
  11027. The sequence grabber component establishes the volume setting by calling the SGSetChannelVolume function, described in the previous section.
  11028. SGSetSoundInputDriver
  11029.  
  11030. Some sound channel components may use sound input devices to obtain their source data. The SGSetSoundInputDriver function allows the sequence grabber component to assign a sound input device to your sound channel.
  11031. pascal ComponentResult SGSetSoundInputDriver (SGChannel c, 
  11032.                                                     const Str255 driverName);
  11033. c    Identifies the channel connection for this operation. 
  11034. driverName
  11035. Specifies the name of the sound input device. This is a Pascal string, and it must correspond to a valid sound input device.
  11036. DESCRIPTION
  11037. If your sound channel component does not use sound input devices, return a nonzero result code. 
  11038. RESULT CODESnoDeviceForChannel     –9400    Channel component cannot find its device    
  11039. cantDoThatInCurrentMode    –9402    Request invalid in current mode    
  11040. deviceCantMeetRequest    –9408    Device cannot support grabber    
  11041.  
  11042. SEE ALSO
  11043. For more information about sound input devices, see Inside Macintosh: More Macintosh Toolbox—in particular, refer to the discussion of the SPBGetIndexedDevice function in the chapter “Sound Manager.”
  11044. SGGetSoundInputDriver
  11045.  
  11046. The SGGetSoundInputDriver function allows the sequence grabber component to determine the sound input device currently in use by your sound channel component. 
  11047. pascal long SGGetSoundInputDriver (SGChannel c);
  11048. c    Identifies the channel connection for this operation. 
  11049. DESCRIPTION
  11050. The sequence grabber component may want to gain access to the sound input device if it wants to change the device’s configuration. For example, the sequence grabber component may want to configure the device for stereo sound. If the sequence 
  11051. grabber component changes any of the device’s operating parameters, it informs your sequence grabber channel component by calling your SGSoundInputDriverChanged function, which is described in the next section.
  11052. The SGGetSoundInputDriver function returns a reference to the sound input device. If your sound channel is not using a sound input device, set the returned value to nil.
  11053. SEE ALSO
  11054. The sequence grabber component can assign a sound input device to a sound channel by calling the SGSetSoundInputDriver function, which is described in the previous section.
  11055. SGSoundInputDriverChanged
  11056.  
  11057. The SGSoundInputDriverChanged function allows the sequence grabber component to notify your sound channel component whenever an application changes the configuration of your sound channel’s sound input device. 
  11058. pascal ComponentResult SGSoundInputDriverChanged (SGChannel c);
  11059. c    Identifies the channel connection for this operation. 
  11060. DESCRIPTION
  11061.  Your component should update any sound device status information it maintains.
  11062. SGSetSoundRecordChunkSize
  11063.  
  11064. During record operations, the sequence grabber component and its sound channels work with groups of sound samples. These groups are referred to as chunks. By default, each chunk contains two seconds of sound data. Smaller chunks use less memory. 
  11065. pascal ComponentResult SGSetSoundRecordChunkSize (SGChannel c,
  11066.                                                                     long seconds);
  11067. c    Identifies the channel connection for this operation. 
  11068. seconds    Specifies the number of seconds of sound data your sound channel component is to work with at a time. This parameter is set to a negative fixed-point number to specify a fraction of a second. For example, to set the duration to half a second, –0.5 is passed in.
  11069. DESCRIPTION
  11070. The sequence grabber component can control the amount of sound data in each chunk by calling the SGSetSoundRecordChunkSize function. The sequence grabber component specifies the number of seconds of sound data your channel is to work with at a time.
  11071. SPECIAL CONSIDERATIONS
  11072. The SGSetSoundRecordChunkSize function may return a fraction of a second (see the discussion of the seconds parameter above).
  11073. RESULT CODESparamErr    –50    Invalid parameter specified    
  11074. cantDoThatInCurrentMode    –9402    Request invalid in current mode    
  11075.  
  11076. SGGetSoundRecordChunkSize
  11077.  
  11078. The SGGetSoundRecordChunkSize function allows the sequence grabber component to determine the amount of sound data your sound channel component works with 
  11079. at a time. 
  11080. pascal long SGGetSoundRecordChunkSize (SGChannel c);
  11081. c    Identifies the channel connection for this operation. 
  11082. DESCRIPTION
  11083. The SGGetSoundRecordChunkSize function returns a long integer that specifies the number of seconds of sound data your channel works with at a time.
  11084. SEE ALSO
  11085. The sequence grabber component sets this value by calling the SGSetSoundRecordChunkSize function, which is described in the previous section.
  11086. SGSetSoundInputRate
  11087.  
  11088. The SGSetSoundInputRate function allows the sequence grabber component to set the rate at which your sound channel obtains its sound data.
  11089. pascal ComponentResult SGSetSoundInputRate (SGChannel c,
  11090.                                                             Fixed rate);
  11091. c    Identifies the channel connection for this operation. 
  11092. rate    Specifies the rate at which your sound channel is to acquire data. This parameter specifies the number of samples your sound channel is to generate per second. If your sound channel cannot support the specified rate, use the closest available rate that you can support. If this parameter is set to 0, use your default rate.
  11093. RESULT CODEScantDoThatInCurrentMode    –9402    Request invalid in current mode    
  11094. deviceCantMeetRequest    –9408    Device cannot support grabber    
  11095.  
  11096. SGGetSoundInputRate
  11097.  
  11098. The SGGetSoundInputRate function allows the sequence grabber component to determine the rate at which your sound channel is collecting sound data.
  11099. pascal Fixed SGGetSoundInputRate (SGChannel c); 
  11100. c    Identifies the channel connection for this operation. 
  11101. DESCRIPTION
  11102. The SGGetSoundInputRate function returns a fixed-point number that indicates the number of samples your sound channel collects per second.
  11103. SEE ALSO
  11104. The sequence grabber component sets this rate by calling the SGSetSoundInputRate function, which is described in the previous section.
  11105. SGSetSoundInputParameters
  11106.  
  11107. The SGSetSoundInputParameters function allows the sequence grabber to set some parameters that relate to sound recording.
  11108. pascal ComponentResult SGSetSoundInputParameters (SGChannel c,
  11109.                                                      short sampleSize,
  11110.                                                      short numChannels,
  11111.                                                      OSType compressionType);
  11112. c    Identifies the channel connection for this operation. 
  11113. sampleSize    
  11114. Specifies the number of bits in each sound sample. This field is set to 8 for 8-bit sound; it is set to 16 for 16-bit sound.
  11115. numChannels    
  11116. Indicates the number of sound channels to be used by the sound sample. This field is set to 1 for monaural sounds; it is set to 2 for stereo sounds.
  11117. compressionType    
  11118. Describes the format of the sound data. The following values are supported:
  11119. 'raw '    Sound samples are uncompressed, in offset-binary format (that is, sample data values range from 0 to 255).
  11120. 'MAC3'    Sound samples have been compressed by the Sound Manager at a ratio of 3:1.
  11121. 'MAC6'    Sound samples have been compressed by the Sound Manager at a ratio of 6:1.
  11122. DESCRIPTION
  11123. Sequence grabbers may use the SGSetSoundInputParameters function to control many parameters relating to sound recording. All of the sound parameters support two special values. If any of these parameters are set to 0, your channel should not change the current value of that parameter. If any are set to –1, return that parameter to its default value. 
  11124. If your sound device cannot support a specified parameter value, return an appropriate Sound Manager result code.
  11125. RESULT CODES
  11126. Sound Manager errors
  11127. SGGetSoundInputParameters
  11128.  
  11129. The SGGetSoundInputParameters function allows the sequence grabber to retrieve some parameters that relate to sound recording.
  11130. pascal ComponentResult SGGetSoundInputParameters (SGChannel c,                             
  11131.                                                     short *sampleSize,
  11132.                                                     short *numChannels,                 
  11133.                                                     OSType *compressionType);
  11134. c    Identifies the channel connection for this operation. 
  11135. sampleSize
  11136. Contains a pointer to a field to receive the sample size. Set this field to 8 for 8-bit sound; set the field to 16 for 16-bit sound.
  11137. numChannels    
  11138. Contains a pointer to a field to receive the number of sound channels used by the sound sample. Set this field to 1 for monaural sounds; set the field to 2 for stereo sounds.
  11139. compressionType    
  11140. Contains a pointer to a field to receive the format of the sound data. You may return the following values:
  11141. 'raw '    Sound samples are uncompressed, in offset-binary format (that is, sample data values range from 0 to 255).
  11142. 'MAC3'    Sound samples have been compressed by the Sound Manager at a ratio of 3:1.
  11143. 'MAC6'    Sound samples have been compressed by the Sound Manager at a ratio of 6:1.
  11144. DESCRIPTION
  11145. The sequence grabber may use the SGGetSoundInputParameters function to retrieve many parameters relating to sound recording. If any of the sound parameters are set to nil, do not return that value. 
  11146. Utility Functions for Sequence Grabber Channel Components
  11147.  
  11148. Sequence grabber components provide several utility functions that your channel component can use. This section discusses those functions.
  11149. The SGAddMovieData function lets you add data and sample references to a movie. 
  11150. Alternatively, you can use the SGWriteMovieData function to add data to a movie, and the SGAddFrameReference and SGGetNextFrameReference functions to keep track of sample references prior to creating a QuickTime movie from recorded data. 
  11151. The SGSortDeviceList function allows you to sort the entries in the device list that you create for the sequence grabber when it calls your SGGetChannelDeviceList function (which is discussed on page 6-60).
  11152. The SGChangedSource function allows you to tell the sequence grabber that you have changed your source device.
  11153. The SGAddFrameReference and SGGetNextFrameReference functions take a pointer to a frame information structure as a parameter. The SeqGrabFrameInfo data type defines the format of a frame information structure.
  11154. struct SeqGrabFrameInfo {
  11155.     long                 frameOffset;                    /* offset to the sample */
  11156.     long                 frameTime;                    /* time that frame was captured */
  11157.     long                 frameSize;                    /* number of bytes in sample */
  11158.     SGChannel                 frameChannel;                    /* current connection to channel */
  11159.     long                 frameRefCon;                    /* reference constant for channel */
  11160. };
  11161. Field descriptions
  11162. Field descriptions
  11163. frameOffset    Specifies the offset to the sample. Your channel component obtains this value from the SGWriteMovieData function, described on page 6-86.
  11164. frameTime    Specifies the time at which your channel component captured the frame. This time value is relative to the data sequence. That is, this time is not represented in the context of any fixed time scale. Rather, your channel component must choose and use a time scale consistently for all sample references.
  11165. frameSize    Specifies the number of bytes in the sample described by the sample reference.
  11166. frameChannel    Identifies the current connection to your channel. 
  11167. frameRefCon    Contains a reference constant for use by your channel component. You can use this value in any way that is appropriate for your channel component. For example, video channel components may use this value to store a reference to frame differencing information for a temporally compressed image sequence.
  11168. SGAddMovieData
  11169.  
  11170. The SGAddMovieData function allows your channel component to add data to a movie. This function combines the services provided by the SGWriteMovieData and SGAddFrameReference functions. Your channel component should not write data directly to the movie file—use this function instead.
  11171. pascal ComponentResult SGAddMovieData (SeqGrabComponent s,     
  11172.                                                     SGChannel c, Ptr p, 
  11173.                                                     long len, 
  11174.                                                     long *offset, 
  11175.                                                     long chRefCon, 
  11176.                                                     TimeValue time, 
  11177.                                                     short writeType);
  11178. s    Specifies the component instance that identifies the sequence grabber component that is using your channel. The sequence grabber provides this to you when it calls your SGInitChannel function (described on page 6-38).
  11179. c    Identifies the connection to your channel.
  11180. p    Specifies the location of the data to be added to the movie.
  11181. len    Indicates the number of bytes of data to be added to the movie.
  11182. offset    Contains a pointer to a field that is to receive the offset to the new data in the movie. The sequence grabber component returns an offset that is correct in the context of the movie resource, even if the movie is currently stored in memory. That is, if the movie is in memory, the returned offset reflects the location that the data will have in a movie on a permanent storage device, such as a disk.
  11183. chRefCon    Contains your channel’s reference constant.
  11184. time    Specifies the time at which your channel captured the frame. This time value is expressed in your channel’s time scale.
  11185. writeType    Specifies the type of write operation. The following values are valid:
  11186. seqGrabWriteAppend
  11187. Append the new data to the end of the file. The sequence grabber sets the field referred to by the offset parameter to reflect the location at which it added the data.
  11188. seqGrabWriteReserve
  11189. Do not write any data to the output file. Instead, reserve space in the output file for the amount of data indicated by the len parameter. The sequence grabber sets the field referred to by the offset parameter to the location of the reserved space.
  11190. seqGrabWriteFill    
  11191. Write the data into the location specified by the field referred to by the offset parameter. The sequence grabber sets that field to the location of the byte following the last byte it wrote. 
  11192.     This option is used to fill the space reserved previously when the writeType parameter was set to seqGrabWriteReserve. 
  11193. RESULT CODES
  11194. File Manager errors
  11195. Memory Manager errors
  11196. SGWriteMovieData
  11197.  
  11198. The SGWriteMovieData function allows your channel component to add data to a movie. 
  11199. pascal ComponentResult SGWriteMovieData (SeqGrabComponent s,
  11200.                                                      SGChannel c, Ptr p, 
  11201.                                                      long len, long *offset);
  11202. s    Contains a component instance that identifies the sequence grabber component that has connected to your channel component. The sequence grabber component provides this value to your channel component when it calls your SGInitChannel function (described on page 6-38).
  11203. c    Identifies the connection to your channel. 
  11204. p    Specifies the location of the data to be added to the movie.
  11205. len    Contains the number of bytes of data to be added to the movie.
  11206. offset    Contains a pointer to a long integer that is to receive the offset to the new data in the movie. The sequence grabber component returns an offset that is correct in the context of a movie resource, even if the movie data is currently stored in memory. That is, if the movie is in memory, the returned offset reflects the location that the data will have in a movie on a permanent storage device, such as a disk.
  11207. DESCRIPTION
  11208. The SGWriteMovieData function behaves differently depending upon when you call it. If you call it from your SGWriteSamples function, this function writes the movie data to the device that contains the recording operation’s movie file. If you call this function at other times, it may write the movie data to a movie in memory, depending upon the recording options that are in effect.
  11209. RESULT CODES
  11210. File Manager errors
  11211. Memory Manager errors
  11212. SGAddFrameReference
  11213.  
  11214. The SGAddFrameReference function allows your channel component to store sample references. 
  11215. pascal ComponentResult SGAddFrameReference (SeqGrabComponent s,
  11216.                                                  SeqGrabFrameInfo *frameInfo);
  11217. s    Contains a component instance that identifies the sequence grabber component that has connected to your channel component. The sequence grabber component provides this value to your channel component when it calls your SGInitChannel function (described on page 6-38).
  11218. frameInfo    Contains a pointer to a frame information structure (defined by the SeqGrabFrameInfo data type). Your component must completely specify the reference by placing the appropriate information into the record referred to by this parameter. The format and content of the frame information structure are described on page 6-84.
  11219. DESCRIPTION
  11220. The sequence grabber component uses the information you provide to create a new sample reference in the movie that contains the captured data. You supply the information for the reference in a frame information structure. 
  11221. RESULT CODES
  11222. Memory Manager errors
  11223. SEE ALSO
  11224. Your component can retrieve these references by calling the SGGetNextFrameReference function, which is described in the next section.
  11225. SGGetNextFrameReference
  11226.  
  11227. The SGGetNextFrameReference function allows your channel component to retrieve the sample references you stored by calling the SGAddMovieData or SGAddFrameReference function, described on page 6-85 and in the previous section, respectively. 
  11228. pascal ComponentResult SGGetNextFrameReference 
  11229.                                             (SeqGrabComponent s,
  11230.                                              SeqGrabFrameInfo *frameInfo,
  11231.                                              TimeValue *frameDuration, 
  11232.                                              long *frameNumber);
  11233. s    Contains a component instance that identifies the sequence grabber component that has connected to your channel component. The sequence grabber component provides this value to your channel component when it calls your SGInitChannel function (described on page 6-38).
  11234. frameInfo    Contains a pointer to a frame information structure (defined by the SeqGrabFrameInfo data type), which is described on page 6-84. Your component must identify itself to the sequence grabber component by setting the frameChannel field of this structure to the component instance that identifies the current connection to your channel. The sequence grabber component then returns information about the specified frame in the remaining fields of this structure. 
  11235. frameDuration
  11236. Contains a pointer to a time value. The sequence grabber component calculates the duration of the specified frame and returns that duration in the structure referred to by this parameter. Note that the sequence grabber component cannot calculate the duration of the last frame in a sequence. In this case, the sequence grabber component sets the returned time value to –1. 
  11237. frameNumber
  11238. Contains a pointer to a long integer. Your channel component specifies the frame number corresponding to the frame about which you want to retrieve information. Frames are numbered starting at 0. However, frame numbers need not start at 0, and they may not be sequential. Set the field referred to by the frameNumber parameter to –1 to retrieve information about the first frame in a movie.
  11239.     The sequence grabber component returns the frame number of the movie’s next frame into the field referred to by this parameter. You can use this value the next time you call SGGetNextFrameReference.
  11240. DESCRIPTION
  11241. The SGGetNextFrameReference function allows your channel component to process these references sequentially or randomly—you specify the relative frame for which you want to retrieve information. The sequence grabber component then retrieves and returns information for that frame. Typically, your channel component calls this function within its SGWriteSamples function (described on page 6-43).
  11242. RESULT CODEparamErr    –50    Invalid parameter specified    
  11243.  
  11244. SGSortDeviceList
  11245.  
  11246. The SGSortDeviceList function allows you to sort your device list alphabetically.
  11247. pascal ComponentResult SGSortDeviceList (SeqGrabComponent s, 
  11248.                                                         SGDeviceList list);
  11249. s    Specifies the component instance that identifies the sequence grabber component that is using your channel. The sequence grabber provides this to you when it calls your SGInitChannel function (described on page 6-38).
  11250. list    Contains a pointer to a device list structure pointer. 
  11251. DESCRIPTION
  11252. Your component constructs its device list whenever the sequence grabber calls your SGGetChannelDeviceList function (described on page 6-60). You may add entries to the device list in any order you like. Once you have built up your device list, you may use the SGSortDeviceList function to sort that list alphabetically, by device name. The sequence grabber correctly updates the selectedIndex field in the device list structure, as well.
  11253. The format and content of the device list structure are discussed earlier in this chapter, in “Working With Channel Devices” beginning on page 6-58.
  11254. RESULT CODEparamErr    –50    Invalid parameter value    
  11255.  
  11256. SGChangedSource
  11257.  
  11258. The SGChangedSource function allows you to tell the sequence grabber that your component is now using a different device.
  11259. pascal ComponentResult SGChangedSource (SeqGrabComponent s,
  11260.                                                         SGChannel c);
  11261. s    Specifies the component instance that identifies the sequence grabber component that is using your channel. The sequence grabber provides this to you when it calls your SGInitChannel function (described on page 6-38).
  11262. c    Identifies the connection to your channel.
  11263. DESCRIPTION
  11264. Applications can instruct your channel to change its input device, for example, by calling the sequence grabber’s SGSetChannelDevice function. The sequence grabber passes this request on to your channel component. Whenever you successfully change your input device, you should tell the sequence grabber by calling its SGChangedSource function. This allows the sequence grabber to update the information it keeps about your channel.
  11265.  
  11266.  
  11267. Summary of Sequence Grabber Channel Components
  11268.  
  11269. C Summary
  11270.  
  11271. Constants
  11272.  
  11273. /* sequence grabber channel component type */
  11274. #define SeqGrabChannelType 'sgch'    
  11275. /* device list structure flags */
  11276. #define sgDeviceListWithIcons (1)                                                                /* include icons */
  11277. #define sgDeviceListDontCheckAvailability (2)                                                                /* don't check available */
  11278.  
  11279. /*    data function write operation types */
  11280. enum {
  11281.     seqGrabWriteAppend,                                            /* append to file */
  11282.     seqGrabWriteReserve,                                            /* reserve space in file */
  11283.     seqGrabWriteFill                                            /* fill reserved space */
  11284. };
  11285. /* flags for SGSetChannelPlayFlags and SGGetChannelPlayFlags functions */
  11286. #define channelPlayNormal 0                                            /* use default playback methodology */
  11287. #define channelPlayFast 1                                            /* achieve fast playback rate */
  11288. #define channelPlayHighQuality 2                                            /* achieve high-quality image */
  11289. #define channelPlayAllData 4                                            /* play all captured data */
  11290. /* usage flags for SGSetChannelUsage and SGGetChannelUsage functions */
  11291. enum {
  11292.     seqGrabRecord                                 = 1,        /* used during record operations */
  11293.     seqGrabPreview                                 = 2,        /* used during preview operations */
  11294.     seqGrabPlayDuringRecord     = 4                                    /* plays data during record operation */
  11295. };
  11296. typedef unsigned char SeqGrabUsageEnum;
  11297. /* SGGetChannelInfo function flags */
  11298. enum {
  11299.     seqGrabHasBounds                                     = 1,        /* visual representation of data */
  11300.     seqGrabHasVolume                                     = 2,        /* audio representation of data */ 
  11301.     seqGrabHasDiscreteSamples                                     = 4        /* data organized in discrete frames */
  11302. };
  11303. typedef unsigned char SeqGrabChannelInfoEnum;
  11304. /* basic sequence grabber channel component selectors */
  11305. kSGSetGWorldSelect                                             = 0x4;            /* SetGWorld */                     
  11306. kSGStartPreviewSelect                                             = 0x10;             /* SGStartPreview */ 
  11307. kSGStartRecordSelect                                             = 0x11;             /* SGStartRecord */ 
  11308. kSGIdleSelect                                             = 0x12;             /* SGIdle */ 
  11309. kSGStopSelect                                             = 0x13;             /* SGStop */ 
  11310. kSGPauseSelect                                             = 0x14;             /* SGPause */ 
  11311. kSGPrepareSelect                                             = 0x15;             /* SGPrepare */ 
  11312. kSGReleaseSelect                                             = 0x16;             /* SGRelease */ 
  11313. kSGUpdateSelect                                             = 0x27;            /* SGUpdate */
  11314.  
  11315. /*  selectors for common channel configuration functions */
  11316. kSGCSetChannelUsageSelect                                             = 0x80;             /* SGSetChannelUsage */ 
  11317. kSGCGetChannelUsageSelect                                             = 0x81;             /* SGGetChannelUsage */ 
  11318. kSGCSetChannelBoundsSelect                                             = 0x82;             /* SGSetChannelBounds */ 
  11319. kSGCGetChannelBoundsSelect                                             = 0x83;             /* SGGetChannelBounds */ 
  11320. kSGCSetChannelVolumeSelect                                             = 0x84;             /* SGSetChannelVolume */ 
  11321. kSGCGetChannelVolumeSelect                                             = 0x85;             /* SGGetChannelVolume */ 
  11322. kSGCGetChannelInfoSelect                                             = 0x86;             /* SGGetChannelInfo */ 
  11323. kSGCSetChannelPlayFlagsSelect                                             = 0x87;             /* SGSetChannelPlayFlags */                                          
  11324. kSGCGetChannelPlayFlagsSelect                                             = 0x88;             /* SGGetChannelPlayFlags */ 
  11325. kSGCSetChannelMaxFramesSelect                                             = 0x89;             /* SGSetChannelMaxFrames */ 
  11326. kSGCGetChannelMaxFramesSelect                                             = 0x8A;             /* SGGetChannelMaxFrames */ 
  11327. kSGCSetChannelRefConSelect                                             = 0x8B;             /* SGSetChannelRefCon */ 
  11328. kSGCSetChannelClipSelect                                             = 0x8C;            /* SGSetChannelClip */
  11329. kSGCGetChannelClipSelect                                             = 0x8D;            /* SGGetChannelClip */
  11330. kSGCGetChannelSampleDescriptionSelect = 0x8E;
  11331.                                                     /* SGCGetChannelSampleDescription */
  11332. kSGCGetChannelDeviceListSelect                                             = 0x8F;            /* SGCGetChannelDeviceList */
  11333. kSGCSetChannelDeviceSelect                                             = 0x90;            /* SGCSetChannelDevice */
  11334. kSGCSetChannelMatrixSelect                                             = 0x91;            /* SGCSetChannelMatrix */
  11335. kSGCGetChannelMatrixSelect                                             = 0x92;            /* SGCGetChannelMatrix */
  11336. kSGCGetChannelTimeScaleSelect                                             = 0x93;            /* SGCGetChannelTimeScale */
  11337.         
  11338. /*  selectors for video channel configuration functions */
  11339. kSGCGetSrcVideoBoundsSelect                                             = 0x100;            /* SGCGetSrcVideoBounds */ 
  11340. kSGCSetVideoRectSelect                                             = 0x101;            /* SGCSetVideoRect */ 
  11341. kSGCGetVideoRectSelect                                             = 0x102;            /* SGCGetVideoRect */ 
  11342. kSGCGetVideoCompressorTypeSelect     = 0x103;             /* SGCGetVideoCompressorType */ 
  11343. kSGCSetVideoCompressorTypeSelect                                                 = 0x104;            /* SGCSetVideoCompressorType */ 
  11344. kSGCSetVideoCompressorSelect                                                 = 0x105;            /* SGCSetVideoCompressor */ 
  11345. kSGCGetVideoCompressorSelect                                                 = 0x106        ;    /* SGCGetVideoCompressor */ 
  11346. kSGCGetVideoDigitizerComponentSelect                                                = 0x107; 
  11347.                                                         /* SGCGetVideoDigitizerComponent */ 
  11348. kSGCSetVideoDigitizerComponentSelect                        = 0x108; 
  11349.                                                         /* SGCSetVideoDigitizerComponent */ 
  11350. kSGCVideoDigitizerChangedSelect                                                 = 0x109; /* SGCVideoDigitizerChanged */ 
  11351. kSGCSetVideoBottlenecksSelect                                                = 0x10a; /* SGCSetVideoBottlenecks */
  11352. kSGCGetVideoBottlenecksSelect                                                 = 0x10b; /* SGCGetVideoBottlenecks */ 
  11353. kSGCGrabFrameSelect                                                 = 0x10c;            /* SGCGrabFrame */ 
  11354. kSGCGrabFrameCompleteSelect                                                 = 0x10d;            /* SGCGrabFrameComplete */ 
  11355. kSGCDisplayFrameSelect                                                 = 0x10e;            /* SGCDisplayFrame */ 
  11356. kSGCCompressFrameSelect                                                 = 0x10f;             /* SGCCompressFrame */ 
  11357. kSGCCompressFrameCompleteSelect                                                 = 0x110;            /* SGCCompressFrameComplete */ 
  11358. kSGCAddFrameSelect                                                 = 0x111; /* SGCAddFrame */ 
  11359. kSGCTransferFrameForCompressSelect                                                 = 0x112;             
  11360.                                                         /* SGCTransferFrameForCompress */ 
  11361. kSGCSetCompressBufferSelect                                                 = 0x113;            /* SGCSetCompressBuffer */ 
  11362. kSGCGetCompressBufferSelect                                                 = 0x114;            /* SGCGetCompressBuffer */ 
  11363. kSGCGetBufferInfoSelect                                                 = 0x115;             /* SGCGetBufferInfo */ 
  11364. kSGCSetUseScreenBufferSelect                                                 = 0x116; /* SGCSetUseScreenBuffer */
  11365. kSGCGetUseScreenBufferSelect                                                 = 0x117; /* SGCGetUseScreenBuffer */
  11366. kSGCGrabCompressCompleteSelect                                                 = 0x118; /* SGCGrabCompressComplete */
  11367. kSGCDisplayCompressSelect                                                 = 0x119; /* SGCDisplayCompress */
  11368. kSGCSetFrameRateSelect                                                 = 0x11A; /* SGCSetFrameRate */
  11369. kSGCGetFrameRateSelect                                                 = 0x11B; /* SGCGetFrameRate */
  11370.      
  11371. /* selectors for sound channel configuration functions */
  11372. kSGCSetSoundInputDriverSelect                                                 = 0x100; /* SGCSetSoundInputDriver */ 
  11373. kSGCGetSoundInputDriverSelect                                                 = 0x101; /* SGCGetSoundInputDriver */ 
  11374. kSGCSoundInputDriverChangedSelect                                                = 0x102; /*                SGCSoundInputDriverChanged */ 
  11375. kSGCSetSoundRecordChunkSizeSelect                                                 = 0x103; /*                SGCSetSoundRecordChunkSize */ 
  11376. kSGCGetSoundRecordChunkSizeSelect                                                 = 0x104; /*                SGCGetSoundRecordChunkSize */ 
  11377. kSGCSetSoundInputRateSelect                                                  = 0x105; /* SGCSetSoundInputRate */ 
  11378. kSGCGetSoundInputRateSelect                                                  = 0x106; /* SGCGetSoundInputRate */         
  11379. kSGCSetSoundInputParametersSelect                                                 = 0x107; /* SGCSetSoundInputParameters */
  11380. kSGCGetSoundInputParametersSelect                                                 = 0x108;            /* SGCGetSoundInputParameters */
  11381.  
  11382. /* selectors for channel control functions */
  11383. kSGCInitChannelSelect                                                 = 0x180; /* SGCInitChannel */ 
  11384. kSGCWriteSamplesSelect                                                 = 0x181; /* SGCWriteSamples */ 
  11385. kSGCGetDataRateSelect                                                 = 0x182; /* SGCDataRate */
  11386. kSGCAlignChannelRectSelect                                                 = 0x183;            /* SGAlignChannelRect */
  11387. }; 
  11388. /* values for pause parameter of SGPause function */
  11389. enum {
  11390.     seqGrabUnpause                    = 0,        /* restart the current operation */
  11391.     seqGrabPause                    = 1,        /* pause the current operation */
  11392. };
  11393. Data Types
  11394.  
  11395. struct SeqGrabFrameInfo {
  11396.     long                 frameOffset;                    /* offset to the sample */
  11397.     long                 frameTime;                    /* time that frame was captured */
  11398.     long                 frameSize;                    /* number of bytes in sample */
  11399.     SGChannel                 frameChannel;                    /* current connection to channel */
  11400.     long                 frameRefCon;                    /* reference constant for channel */
  11401. };
  11402. typedef struct SGDeviceListRecord {
  11403.     short                    count;                        /* count of devices */
  11404.     short                    selectedIndex;                        /* current device */
  11405.     long                    reserved;                        /* set to 0 */
  11406.     SGDeviceName                    entry[1];                        /* device names */
  11407. } SGDeviceListRecord, *SGDeviceListPtr, **SGDeviceList;
  11408. typedef struct SGDeviceName {    
  11409.     Str63                name;                        /* device name */
  11410.     Handle                icon;                        /* device icon */
  11411.     long                flags;                        /* flags */
  11412.     long                refCon;                        /* set to 0 */
  11413.     long                reserved;                        /* set to 0 */
  11414. } SGDeviceName;
  11415. Functions
  11416.  
  11417. Configuring Sequence Grabber Channel Components
  11418. pascal ComponentResult SGInitChannel
  11419. (SGChannel c, SeqGrabComponent owner);
  11420. pascal ComponentResult SGSetGWorld
  11421. (SeqGrabComponent s, CGrafPtr gp, GDHandle gd);
  11422. Controlling Sequence Grabber Channel Components
  11423. pascal ComponentResult SGStartPreview
  11424. (SeqGrabComponent s);
  11425. pascal ComponentResult SGStartRecord
  11426. (SeqGrabComponent s);
  11427. pascal ComponentResult SGIdle
  11428. (SeqGrabComponent s);
  11429. pascal ComponentResult SGUpdate
  11430. (SeqGrabComponent s, RgnHandle updateRgn);
  11431. pascal ComponentResult SGStop
  11432. (SeqGrabComponent s);
  11433. pascal ComponentResult SGWriteSamples
  11434. (SGChannel c, Movie m, AliasHandle theFile);
  11435. pascal ComponentResult SGPause 
  11436. (SeqGrabComponent s, Byte pause);
  11437. pascal ComponentResult SGPrepare 
  11438. (SeqGrabComponent s, Boolean prepareForPreview, 
  11439. Boolean prepareForRecord);
  11440. pascal ComponentResult SGRelease
  11441. (SeqGrabComponent s);
  11442. Configuration Functions for All Channel Components
  11443. pascal ComponentResult SGSetChannelUsage 
  11444. (SGChannel c, long usage);
  11445. pascal ComponentResult SGGetChannelUsage 
  11446. (SGChannel c, long *usage);
  11447. pascal ComponentResult SGGetChannelInfo
  11448. (SGChannel c, long *channelInfo);
  11449. pascal ComponentResult SGSetChannelPlayFlags
  11450. (SGChannel c, long playFlags);
  11451. pascal ComponentResult SGGetChannelPlayFlags
  11452. (SGChannel c, long *playFlags);
  11453. pascal ComponentResult SGSetChannelMaxFrames
  11454. (SGChannel c, long frameCount);
  11455. pascal ComponentResult SGGetChannelMaxFrames
  11456. (SGChannel c, long *frameCount);
  11457. pascal ComponentResult SGSetChannelRefCon
  11458. (SGChannel c, long refCon);
  11459. pascal ComponentResult SGGetDataRate
  11460. (SGChannel c, long *bytesPerSecond);
  11461. pascal ComponentResult SGGetChannelSampleDescription 
  11462. (SGChannel c, Handle sampleDesc);
  11463. pascal ComponentResult SGGetChannelTimeScale 
  11464. (SGChannel c, TimeScale *scale);
  11465. pascal ComponentResult SGSetChannelClip 
  11466. (SGChannel c, RgnHandle theClip);
  11467. pascal ComponentResult SGGetChannelClip 
  11468. (SGChannel c, RgnHandle *theClip);
  11469. pascal ComponentResult SGSetChannelMatrix 
  11470. (SGChannel c, const MatrixRecord *m);
  11471. pascal ComponentResult SGGetChannelMatrix 
  11472. (SGChannel c, MatrixRecord *m);
  11473. Working With Channel Devices
  11474. pascal ComponentResult SGGetChannelDeviceList 
  11475. (SGChannel c, long selectionFlags, 
  11476. SGDeviceList *list);
  11477. pascal ComponentResult SGSetChannelDevice 
  11478. (SGChannel c, StringPtr name);
  11479. Configuration Functions for Video Channel Components
  11480. pascal ComponentResult SGSetChannelBounds
  11481. (SGChannel c, Rect *bounds);
  11482. pascal ComponentResult SGGetChannelBounds 
  11483. (SGChannel c, const Rect *bounds);
  11484. pascal ComponentResult SGGetSrcVideoBounds
  11485. (SGChannel c, Rect *r);
  11486. pascal ComponentResult SGSetVideoRect
  11487. (SGChannel c, Rect *r);
  11488. pascal ComponentResult SGGetVideoRect 
  11489. (SGChannel c, Rect *r);
  11490. pascal ComponentResult SGSetVideoCompressorType 
  11491. (SGChannel c, OSType compressorType);
  11492. pascal ComponentResult SGGetVideoCompressorType 
  11493. (SGChannel c, OSType *compressorType);
  11494. pascal ComponentResult SGSetVideoCompressor 
  11495. (SGChannel c, short depth, 
  11496. CompressorComponent compressor, 
  11497. CodecQ spatialQuality, CodecQ temporalQuality, long keyFrameRate);
  11498. pascal ComponentResult SGGetVideoCompressor 
  11499. (SGChannel c, short *depth, 
  11500. CompressorComponent *compressor, 
  11501. CodecQ *spatialQuality, 
  11502. CodecQ *temporalQuality, long *keyFrameRate);
  11503. pascal ComponentResult SGSetVideoDigitizerComponent 
  11504. (SGChannel c, ComponentInstance vdig);
  11505. pascal ComponentInstance SGGetVideoDigitizerComponent 
  11506. (SGChannel c);
  11507. pascal ComponentResult SGVideoDigitizerChanged 
  11508. (SGChannel c);
  11509. pascal ComponentResult SGSetCompressBuffer 
  11510. (SGChannel c, short depth, 
  11511. const Rect *compressSize);
  11512. pascal ComponentResult SGGetCompressBuffer 
  11513. (SGChannel c, short *depth, Rect *compressSize);
  11514. pascal ComponentResult SGSetFrameRate 
  11515. (SGChannel c, Fixed frameRate);
  11516. pascal ComponentResult SGGetFrameRate 
  11517. (SGChannel c, Fixed *frameRate);
  11518. pascal ComponentResult SGSetUseScreenBuffer 
  11519. (SGChannel c, Boolean useScreenBuffer);
  11520. pascal ComponentResult SGGetUseScreenBuffer 
  11521. (SGChannel c, Boolean *useScreenBuffer);
  11522. pascal ComponentResult SGAlignChannelRect
  11523. (SGChannel c, Rect *r);
  11524. Configuration Functions for Sound Channel Components
  11525. pascal ComponentResult SGSetChannelVolume 
  11526. (SGChannel c, short volume);
  11527. pascal ComponentResult SGGetChannelVolume 
  11528. (SGChannel c, short *volume);
  11529. pascal ComponentResult SGSetSoundInputDriver 
  11530. (SGChannel c, const Str255 driverName);
  11531. pascal long SGGetSoundInputDriver 
  11532. (SGChannel c);
  11533. pascal ComponentResult SGSoundInputDriverChanged 
  11534. (SGChannel c);
  11535. pascal ComponentResult SGSetSoundRecordChunkSize 
  11536. (SGChannel c, long seconds);
  11537. pascal long SGGetSoundRecordChunkSize 
  11538. (SGChannel c);
  11539. pascal ComponentResult SGSetSoundInputRate 
  11540. (SGChannel c, Fixed rate);
  11541. pascal Fixed SGGetSoundInputRate 
  11542. (SGChannel c); 
  11543. pascal ComponentResult SGSetSoundInputParameters 
  11544. (SGChannel c, short sampleSize, 
  11545. short numChannels, OSType compressionType);
  11546. pascal ComponentResult SGGetSoundInputParameters 
  11547. (SGChannel c, short *sampleSize, 
  11548. short *numChannels, OSType *compressionType);
  11549. Utility Functions for Sequence Grabber Channel Components
  11550. pascal ComponentResult SGAddMovieData    
  11551. (SeqGrabComponent s, SGChannel c, Ptr p, 
  11552. long len, long *offset, long chRefCon, TimeValue time, short writeType);
  11553. pascal ComponentResult SGWriteMovieData 
  11554. (SeqGrabComponent s, SGChannel c, 
  11555. Ptr p, long len, long *offset);
  11556. pascal ComponentResult SGAddFrameReference 
  11557. (SeqGrabComponent s, 
  11558. SeqGrabFrameInfo *frameInfo);
  11559. pascal ComponentResult SGGetNextFrameReference 
  11560. (SeqGrabComponent s, 
  11561. SeqGrabFrameInfo *frameInfo, 
  11562. TimeValue *frameDuration, 
  11563. long *frameNumber);
  11564. pascal ComponentResult SGSortDeviceList
  11565. (SeqGrabComponent s, SGDeviceList list);
  11566. pascal ComponentResult SGChangedSource 
  11567. (SeqGrabComponent s, SGChannel c);
  11568. Pascal Summary
  11569.  
  11570. Constants
  11571.  
  11572. CONST
  11573.     SeqGrabChannelType = 'sgch';    {sequence grabber channel component type}
  11574.  
  11575.  
  11576.     {device list structure flags}
  11577.     sgDeviceListWithIcons                                                = 1;            {include icons}
  11578.     sgDeviceListDontCheckAvailability                                                = 2;            {don't check available }
  11579.                                                                 { device list}
  11580.  
  11581.     {flags for SGSetChannelPlayFlags and SGGetChannelPlayFlags functions}
  11582.     channelPlayNormal                                         = 0        {use default play methodology}
  11583.     channelPlayFast                                        = 1;        {sacrifice playback quality }
  11584.                                                     { for specified rate}
  11585.     channelPlayHighQuality                                        = 2;        {sacrifice playback rate }
  11586.                                                     { for image quality}
  11587.     channelPlayAllData                                        = 4;        {play all captured data }
  11588.                                                     { including that stored in }
  11589.                                                     { offscreen buffers}
  11590.  
  11591.     {flags for SGSetChannelUsage and SGGetChannelUsage functions}
  11592.     seqGrabRecord                                         = 1;        {used during record operations}
  11593.     seqGrabPreview                                         = 2;        {used during preview operations}
  11594.     seqGrabPlayDuringRecord                                         = 4;        {used during record operations}
  11595.  
  11596.     {SGGetChannelInfo function flags}
  11597.     seqGrabHasBounds                                         = 1;        {visual representation of data}
  11598.     seqGrabHasVolume                                         = 2;        {audio representation of data}
  11599.     seqGrabHasDiscreteSamples                                         = 4;        {data organized in discrete frames}
  11600.     
  11601.     {basic sequence grabber channel component selectors}
  11602.     kSGSetGWorldSelect                                         = $4;            {SGSetGWorld    }
  11603.     kSGStartPreviewSelect                                         = $10;             {SGStartPreview}
  11604.     kSGStartRecordSelect                                         = $11;             {SGStartRecord}
  11605.     kSGIdleSelect                                         = $12;             {SGIdle}
  11606.     kSGStopSelect                                         = $13;             {SGStop}
  11607.     kSGPauseSelect                                         = $14;             {SGPause}
  11608.     kSGPrepareSelect                                         = $15;             {SGPrepare}
  11609.  
  11610.     kSGReleaseSelect                                         = $16;             {SGRelease}
  11611.     kSGUpdateSelect                                        = $27;            {SGUpdate}
  11612.  
  11613.     {selectors for common channel configuration functions}
  11614.     kSGCSetChannelUsageSelect                                         = $80;            {SGCSetChannelUsage}
  11615.     kSGCGetChannelUsageSelect                                         = $81;            {SGCGetChannelUsage}
  11616.     kSGCSetChannelBoundsSelect                                         = $82;            {SGCSetChannelBounds}
  11617.     kSGCGetChannelBoundsSelect                                         = $83;            {SGCGetChannelBounds}
  11618.     kSGCSetChannelVolumeSelect                                         = $84;            {SGCSetChannelVolume}
  11619.     kSGCGetChannelVolumeSelect                                         = $85;             {SGCGetChannelVolume}
  11620.     kSGCGetChannelInfoSelect                                         = $86;             {SGCGetChannelInfo}
  11621.     kSGCSetChannelPlayFlagsSelect                                         = $87;             {SGCSetChannelPlayFlags}                                         
  11622.     kSGCGetChannelPlayFlagsSelect                                         = $88;             {SGCGetChannelPlayFlags}
  11623.     kSGCSetChannelMaxFramesSelect                                         = $89;             {SGCSetChannelMaxFrames}
  11624.     kSGCGetChannelMaxFramesSelect                                         = $8A;             {SGCGetChannelMaxFrames}
  11625.     kSGCSetChannelRefConSelect                                         = $8B;             {SGCSetChannelRefCon}
  11626.     kSGCSetChannelClipSelect                                         = $8C;            {SGSetChannelClip}
  11627.     kSGCGetChannelClipSelect                                         = $8D;            {SGGetChannelClip}
  11628.     kSGCGetChannelSampleDescriptionSelect 
  11629.                                             = $8E;            {SGCGetChannelSampleDescription}
  11630.     kSGCGetChannelDeviceListSelect = $8F;                                                    {SGCGetChannelDeviceList}
  11631.     kSGCSetChannelDeviceSelect                                         = $90;            {SGCSetChannelDevice}
  11632.     kSGCSetChannelMatrixSelect                                         = $91;            {SGCSetChannelMatrix}
  11633.     kSGCGetChannelMatrixSelect                                         = $92;            {SGCGetChannelMatrix}
  11634.     kSGCGetChannelTimeScaleSelect     = $93;                                                {SGCGetChannelTimeScale}
  11635.     
  11636.     {selectors for video channel configuration functions}
  11637.     kSGCGetSrcVideoBoundsSelect                                                 = $100;            {SGCGetSrcVideoBounds}
  11638.     kSGCSetVideoRectSelect                                                 = $101;            {SGCSetVideoRect}
  11639.     kSGCGetVideoRectSelect                                                 = $102;            {SGCGetVideoRect}
  11640.     kSGCGetVideoCompressorTypeSelect                                                 = $103;            {SGCGetVideoCompressorType}
  11641.     kSGCSetVideoCompressorTypeSelect                                                 = $104;            {SGCSetVideoCompressorType}
  11642.     kSGCSetVideoCompressorSelect                                                 = $105;            {SGCSetVideoCompressor}
  11643.     kSGCGetVideoCompressorSelect                                                 = $106        ;    {SGCGetVideoCompressor}
  11644.     kSGCGetVideoDigitizerComponentSelect                                                = $107;        
  11645.                                                             {SGCGetVideoDigitizerComponent}
  11646.     kSGCSetVideoDigitizerComponentSelect                                                = $108;            
  11647.                                                             {SGCSetVideoDigitizerComponent}
  11648.     kSGCVideoDigitizerChangedSelect                                                 = $109;            {SGCVideoDigitizerChanged}
  11649.     kSGCSetVideoBottlenecksSelect                                                = $10A;             {SGCSetVideoBottlenecks}
  11650.     kSGCGetVideoBottlenecksSelect                                                 = $10B;             {SGCGetVideoBottlenecks}
  11651.     kSGCGrabFrameSelect                                                 = $10C;            {SGCGrabFrame}
  11652.     kSGCGrabFrameCompleteSelect                                                 = $10D;            {SGCGrabFrameComplete}
  11653.     kSGCDisplayFrameSelect                                                 = $10E;            {SGCDisplayFrame}
  11654.     kSGCCompressFrameSelect                                                 = $10F;             {SGCCompressFrame}
  11655.     kSGCCompressFrameCompleteSelect                                                 = $110;            {SGCCompressFrameComplete}
  11656.     kSGCAddFrameSelect                                                 = $111;             {SGCAddFrame}
  11657.     kSGCTransferFrameForCompressSelect                                                 = $112;            {SGCTransferFrameForCompress}
  11658.     kSGCSetCompressBufferSelect                                                 = $113;            {SGCSetCompressBuffer}
  11659.     kSGCGetCompressBufferSelect                                                 = $114;            {SGCGetCompressBuffer}
  11660.     kSGCGetBufferInfoSelect                                                 = $115;             {SGCGetBufferInfo}
  11661.     kSGCSetUseScreenBufferSelect                                                 = $116;             {SGCSetUseScreenBuffer}
  11662.     kSGCGetUseScreenBufferSelect                                                 = $117;             {SGCGetUseScreenBuffer}
  11663.     kSGCGrabCompressCompleteSelect                                                 = $118;             {SGCGrabCompressComplete}
  11664.     kSGCDisplayCompressSelect                                                 = $119;             {SGCDisplayCompress}
  11665.     kSGCSetFrameRateSelect                                                 = $11A;             {SGCSetFrameRate}
  11666.     kSGCGetFrameRateSelect                                                 = $11B;             {SGCGetFrameRate}
  11667.      
  11668.     {selectors for sound channel configuration functions}
  11669.     kSGCSetSoundInputDriverSelect                                                 = $100;             {SGCSetSoundInputDriver}
  11670.     kSGCGetSoundInputDriverSelect                                                 = $101;             {SGCGetSoundInputDriver}
  11671.     kSGCSoundInputDriverChangedSelect                                                 = $102;            {SGCSoundInputDriverChanged}
  11672.     kSGCSetSoundRecordChunkSizeSelect                                                 = $103;            {SGCSetSoundRecordChunkSize}
  11673.     kSGCGetSoundRecordChunkSizeSelect                                                 = $104;             {SGCGetSoundRecordChunkSize}
  11674.     kSGCSetSoundInputRateSelect                                                 = $105;             {SGCSetSoundInputRate}
  11675.     kSGCGetSoundInputRateSelect                                                 = $106;             {SGCGetSoundInputRate}        
  11676.     kSGCSetSoundInputParametersSelect                                                 = $107;             {SGCSetSoundInputParameters}
  11677.     kSGCGetSoundInputParametersSelect                                                 = $108;            {SGCGetSoundInputParameters}
  11678.  
  11679.     {selectors for channel control functions}
  11680.     kSGCInitChannelSelect                                                 = $180; {SGCInitChannel}
  11681.     kSGCWriteSamplesSelect                                                 = $181; {SGCWriteSamples}
  11682.     kSGCGetDataRateSelect                                                 = $182; {SGCDataRate}
  11683.     {values for the pause parameter of the SGPause function}
  11684.     seqGrabUnpause                        = 0;            {restart current operation}
  11685.     seqGrabPause                        = 1;            {pause the current operation}
  11686. Data Types
  11687.  
  11688. TYPE
  11689.     SeqGrabFrameInfo =
  11690.     RECORD
  11691.         frameOffset:                        LongInt;                {offset to the sample}
  11692.         frameTime:                        LongInt;                {time that frame was captured}
  11693.         frameChannel:                        SGChannel;                {current connection to channel}
  11694.         frameRefCon:                        LongInt;                {reference constant for channel}
  11695.     END;
  11696. SGDeviceListPtr = ^SGDeviceListRecord;
  11697. SGDeviceList = ^SGDeviceListPtr;
  11698.     SGDeviceListRecord =
  11699.     RECORD
  11700.         count:                    Integer;                                        {count of devices}
  11701.         selectedIndex:                    Integer;                                        {current device}
  11702.         reserved:                    LongInt    ;                                    {set to 0}
  11703.         entry:                     ARRAY[0..] OF SGDeviceName;                                        {device names}
  11704.     END;
  11705.     SGDeviceName =
  11706.     RECORD
  11707.         name:                Str63;                {device name}
  11708.         icon:                Handle;                {device icon}
  11709.         flags:                 LongInt;                {flags}
  11710.         refCon:                LongInt;                {set to 0}
  11711.         reserved:                LongInt;                {set to 0}
  11712. }     END;
  11713. Routines
  11714.  
  11715. Configuring Sequence Grabber Channel Components
  11716. FUNCTION SGInitChannel     (c: SGChannel; owner: SeqGrabComponent): ComponentResult;
  11717. FUNCTION SGSetGWorld     (s: SeqGrabComponent; gp: CGrafPtr; 
  11718. gd: GDHandle): ComponentResult;
  11719. Controlling Sequence Grabber Channel Components
  11720. FUNCTION SGStartPreview     (s: SeqGrabComponent): ComponentResult;
  11721. FUNCTION SGStartRecord     (s: SeqGrabComponent): ComponentResult;
  11722. FUNCTION SGIdle     (s: SeqGrabComponent): ComponentResult;
  11723. FUNCTION SGUpdate    (s SeqGrabComponent; updateRgn RgnHandle): ComponentResult;
  11724. FUNCTION SGStop     (s: SeqGrabComponent): ComponentResult;
  11725. FUNCTION SGWriteSamples     (c: SGChannel; m: Movie; theFile: AliasHandle): ComponentResult;
  11726. FUNCTION SGPause     (s: SeqGrabComponent; pause: Byte): ComponentResult;
  11727. FUNCTION SGPrepare     (s: SeqGrabComponent; 
  11728. prepareForPreview: Boolean; 
  11729. prepareForRecord: Boolean): ComponentResult;
  11730. FUNCTION SGRelease     (s: SeqGrabComponent): ComponentResult;
  11731. Configuration Routines for All Channel Components
  11732. FUNCTION SGSetChannelUsage     (c: SGChannel; usage: LongInt): ComponentResult;
  11733. FUNCTION SGGetChannelUsage     (c: SGChannel; 
  11734. VAR usage: LongInt): ComponentResult;
  11735. FUNCTION SGGetChannelInfo     (c: SGChannel; 
  11736. VAR channelInfo: LongInt): ComponentResult;
  11737. FUNCTION SGSetChannelPlayFlags 
  11738. (c: SGChannel; playFlags: LongInt): ComponentResult;
  11739. FUNCTION SGGetChannelPlayFlags 
  11740. (c: SGChannel; VAR playFlags: LongInt): ComponentResult;
  11741. FUNCTION SGSetChannelMaxFrames 
  11742. (c: SGChannel; frameCount: LongInt): ComponentResult;
  11743. FUNCTION SGGetChannelMaxFrames
  11744. (c: SGChannel; VAR frameCount: LongInt): ComponentResult;
  11745. FUNCTION SGSetChannelRefCon 
  11746. (c: SGChannel; refCon: LongInt): ComponentResult;
  11747. FUNCTION SGGetDataRate     (c: SGChannel; 
  11748. VAR bytesPerSecond: LongInt): ComponentResult;
  11749. FUNCTION SGGetChannelSampleDescription 
  11750. (c: SGChannel; sampleDesc: Handle): ComponentResult;
  11751. FUNCTION SGGetChannelTimeScale 
  11752. (c: SGChannel; VAR scale: TimeScale): ComponentResult;
  11753. FUNCTION SGSetChannelClip    (c: SGChannel; theClip: RgnHandle): ComponentResult;
  11754. FUNCTION SGGetChannelClip    (c: SGChannel; VAR theClip: RgnHandle): ComponentResult;
  11755. FUNCTION SGSetChannelMatrix 
  11756. (c: SGChannel; VAR m: MatrixRecord): ComponentResult;
  11757. FUNCTION SGGetChannelMatrix
  11758. (c: SGChannel; VAR m: MatrixRecord): ComponentResult;
  11759. Working With Channel Devices
  11760. FUNCTION SGGetChannelDeviceList 
  11761. (c: SGChannel; selectionFlags: LongInt; 
  11762. VAR list: SGDeviceList): ComponentResult;
  11763. FUNCTION SGSetChannelDevice 
  11764. (c: SGChannel; name: StringPtr): ComponentResult;
  11765. Configuration Routines for Video Channel Components
  11766. FUNCTION SGSetChannelBounds     (c: SGChannel; bounds: Rect): ComponentResult;
  11767. FUNCTION SGGetChannelBounds     (c: SGChannel; VAR bounds: Rect): ComponentResult;
  11768. FUNCTION SGGetSrcVideoBounds
  11769. (c: SGChannel; VAR r: Rect): ComponentResult;
  11770. FUNCTION SGSetVideoRect     (c: SGChannel; r: Rect): ComponentResult;
  11771. FUNCTION SGGetVideoRect     (c: SGChannel; VAR r: Rect): ComponentResult;
  11772. FUNCTION SGSetVideoCompressorType 
  11773. (c: SGChannel; 
  11774. compressorType: OSType): ComponentResult;
  11775. FUNCTION SGGetVideoCompressorType 
  11776. (c: SGChannel; 
  11777. VAR compressorType: OSType): ComponentResult;
  11778. FUNCTION SGSetVideoCompressor 
  11779. (c: SGChannel; depth: Integer; 
  11780. compressor: CompressorComponent; spatialQuality: CodecQ; 
  11781. temporalQuality: CodecQ; 
  11782. keyFrameRate: LongInt): ComponentResult;
  11783. FUNCTION SGGetVideoCompressor 
  11784. (c: SGChannel; VAR depth: Integer; 
  11785. VAR compressor: CompressorComponent; 
  11786. VAR spatialQuality: CodecQ; 
  11787. VAR temporalQuality: CodecQ; 
  11788. VAR keyFrameRate: LongInt): ComponentResult;
  11789. FUNCTION SGSetVideoDigitizerComponent 
  11790. (c: SGChannel; vdig: ComponentInstance): ComponentResult;
  11791. FUNCTION SGGetVideoDigitizerComponent 
  11792. (c: SGChannel): ComponentInstance;
  11793. FUNCTION SGVideoDigitizerChanged 
  11794. (c: SGChannel): ComponentResult;
  11795. FUNCTION SGSetCompressBuffer
  11796. (c: SGChannel; depth: Integer; 
  11797. compressSize: Rect): ComponentResult;
  11798. FUNCTION SGGetCompressBuffer
  11799. (c: SGChannel; VAR depth: Integer; 
  11800. VAR compressSize: Rect): ComponentResult;
  11801. FUNCTION SGSetFrameRate     (c: SGChannel; frameRate: Fixed): ComponentResult;
  11802. FUNCTION SGGetFrameRate    (c: SGChannel; VAR frameRate: Fixed): ComponentResult;
  11803. FUNCTION SGSetUseScreenBuffer 
  11804. (c: SGChannel; useScreenBuffer: Boolean): ComponentResult;
  11805. FUNCTION SGGetUseScreenBuffer 
  11806. (c: SGChannel; VAR useScreenBuffer: Boolean): ComponentResult;
  11807. FUNCTION SGAlignChannelRect
  11808. (c: SGChannel; VAR r: Rect): ComponentResult;
  11809. Configuration Routines for Sound Channel Components
  11810. FUNCTION SGSetChannelVolume
  11811. (c: SGChannel; volume: Integer): ComponentResult;
  11812. FUNCTION SGGetChannelVolume
  11813. (c: SGChannel; VAR volume: Integer): ComponentResult;
  11814. FUNCTION SGSetSoundInputDriver 
  11815. (c: SGChannel; driverName: Str255): ComponentResult;
  11816. FUNCTION SGGetSoundInputDriver 
  11817. (c: SGChannel): LongInt;
  11818. FUNCTION SGSoundInputDriverChanged 
  11819. (c: SGChannel): ComponentResult;
  11820. FUNCTION SGSetSoundRecordChunkSize 
  11821. (c: SGChannel; seconds: LongInt): ComponentResult;
  11822. FUNCTION SGGetSoundRecordChunkSize 
  11823. (c: SGChannel): LongInt;
  11824. FUNCTION SGSetSoundInputRate
  11825. (c: SGChannel; rate: Fixed): ComponentResult;
  11826. FUNCTION SGGetSoundInputRate
  11827. (c: SGChannel): Fixed; 
  11828. FUNCTION SGSetSoundInputParameters 
  11829. (c: SGChannel; sampleSize: Integer;
  11830. numChannels: Integer; 
  11831. compressionType: OSType): ComponentResult;
  11832. FUNCTION SGGetSoundInputParameters 
  11833. (c: SGChannel; VAR sampleSize: Integer; 
  11834. VAR numChannels: Integer; 
  11835. VAR compressionType: OSType): ComponentResult;
  11836. Utility Routines for Sequence Grabber Channel Components
  11837. FUNCTION SGAddMovieData    (s: SeqGrabComponent; c: SGChannel; p: Ptr; 
  11838. len: LongInt; VAR offset: LongInt; 
  11839. chRefCon: LongInt; time: TimeValue; 
  11840. writeType: Integer): ComponentResult;
  11841. FUNCTION SGWriteMovieData     (s: SeqGrabComponent; c: SGChannel; p: Ptr; 
  11842. len: LongInt; VAR offset: LongInt): ComponentResult;
  11843. FUNCTION SGAddFrameReference
  11844. (s: SeqGrabComponent; 
  11845. VAR frameInfo: SeqGrabFrameInfo): ComponentResult;
  11846. FUNCTION SGGetNextFrameReference 
  11847. (s: SeqGrabComponent; 
  11848. VAR frameInfo: SeqGrabFrameInfo; 
  11849. VAR frameDuration: TimeValue; 
  11850. VAR frameNumber: LongInt): ComponentResult;
  11851. FUNCTION SGSortDeviceList    (s: SeqGrabComponent; list: SGDeviceList): ComponentResult;
  11852. FUNCTION SGChangedSource     (s: SeqGrabComponent; c: SGChannel): ComponentResult;
  11853. Result CodesnoDeviceForChannel     –9400    Channel component cannot find its device    
  11854. cantDoThatInCurrentMode    –9402    Request invalid in current mode    
  11855. notEnoughMemoryToGrab    –9403    Insufficient memory for record operation    
  11856. notEnoughDiskSpaceToGrab    –9404    Insufficient disk space for record operation    
  11857. seqGrabInfoNotAvailable    –9407    Channel component cannot support request    
  11858. deviceCantMeetRequest    –9408    Device cannot support grabber    
  11859.  
  11860.  
  11861.  
  11862. Listing 7-0
  11863. Table 7-0
  11864. Sequence Grabber Panel Components
  11865. Contents
  11866. About Sequence Grabber Panel Components7-4
  11867. Creating Sequence Grabber Panel Components7-7
  11868. Implementing the Required Component Functions7-9
  11869. Managing the Dialog Box7-11
  11870. Managing Your Panel’s Settings7-13
  11871. Sequence Grabber Panel Components Reference7-14
  11872. Component Flags for Sequence Grabber Panel Components7-15
  11873. Functions7-15
  11874. Managing Your Panel Component7-15
  11875. Processing Your Panel’s Events7-21
  11876. Managing Your Panel’s Settings7-24
  11877. Summary of Sequence Grabber Panel Components7-27
  11878. C Summary7-27
  11879. Constants7-27
  11880. Functions7-28
  11881. Pascal Summary7-29
  11882. Constants7-29
  11883. Routines7-29
  11884. Result Codes7-30
  11885. Sequence Grabber Panel Components
  11886. This chapter discusses sequence grabber panel components. Sequence grabber components create a settings dialog box that includes items that are managed 
  11887. by sequence grabber panel components and sequence grabber channel components. Sequence grabber panel components allow sequence grabber components to obtain configuration information from the user for a particular sequence grabber channel component. Applications never call sequence grabber panel components directly; application developers use panel components only by calling the sequence grabber component.
  11888. This chapter is divided into the following sections:
  11889. n    “About Sequence Grabber Panel Components” provides a general introduction to components of this type.
  11890. n    “Creating Sequence Grabber Panel Components” discusses how sequence grabbers use these components.
  11891. n    “Sequence Grabber Panel Components Reference” presents detailed information about the functions that are supported by these components.
  11892. n    “Summary of Sequence Grabber Panel Components” contains a condensed listing of the constants and functions supported by these components.
  11893. This chapter addresses developers of sequence grabber panel components. If you plan to create a sequence grabber panel component, you should read the entire chapter. If you are writing an application that uses components of this type, you do not need to read this chapter. Refer to the chapter “Sequence Grabber Components” in this book for information about sequence grabber components and how to display the settings dialog box to the user.
  11894. As components, sequence grabber panel components rely on the facilities of the Component Manager. In order to use any component, your application must also 
  11895. use the Component Manager. If you are not familiar with this manager, see the chapter “Component Manager” in Inside Macintosh: More Macintosh Toolbox. In addition, you should be familiar with sequence grabber components and sequence grabber channel components. See the chapters “Sequence Grabber Components” and “Sequence Grabber Channel Components” in this book for more information.
  11896. Note
  11897. The text in this chapter makes numerous references to sequence grabber components, sequence grabber channel components, and sequence grabber panel components. For the sake of brevity, shortened names have been adopted for each of these components. Consequently, you will often find sequence grabber components referred to as sequence grabbers; sequence grabber channel components as channel components; and sequence grabber panel components as panel components.u
  11898.  
  11899.  
  11900. About Sequence Grabber Panel Components
  11901.  
  11902. This section provides background information about sequence grabber panel components. After reading this section, you should understand why these components exist and whether you need to create one.
  11903. Sequence grabber panel components augment the capabilities of sequence grabber components and sequence grabber channel components by allowing sequence grabbers to obtain configuration information from the user for a particular digitizing source that is managed by a channel component. Consequently, sequence grabbers, channel components, and panel components have a close relationship. Figure 7-1 shows this relationship and how these components interact with one another to place digitized data into a QuickTime movie.
  11904. Figure 7-1    Sequence grabbers, channel components, and panel components
  11905.  
  11906. Sequence grabbers present a settings dialog box to the user whenever an application calls the SGSettingsDialog function (see the chapter “Sequence Grabber Components” in this book for more information about this sequence grabber function). Applications never call sequence grabber panel components directly; application developers use panel components only by calling the sequence grabber component. 
  11907. Although the sequence grabber creates the dialog box and manages its interactions with the user, portions of the dialog box are controlled by panel components and channel components. Figure 7-2 shows a sample dialog box and identifies the various parts of the dialog box.
  11908. Figure 7-2    A sample sequence grabber settings dialog box
  11909.  
  11910. The sequence grabber creates the dialog box itself and manages the OK and Cancel buttons and the panel pop-up menu. Channel components are responsible for the monitor area on the right side of the dialog box. Panel components manage the 
  11911. settings area immediately below the panel pop-up menu. Only one panel component is active at any given time; the user selects a panel component by manipulating the panel pop-up menu.
  11912. When the user selects a specific panel component, the sequence grabber works with 
  11913. that component to build the panel settings dialog area and present it to the user. The panel component processes dialog events and mouse clicks as appropriate and validates the user’s settings. The sequence grabber then retrieves the settings from the panel component and stores those settings. 
  11914. There are two circumstances under which you should consider creating a sequence grabber panel component: first, if you want to support special digitizing equipment in the QuickTime environment; and, second, if you have created your own sequence grabber channel component. 
  11915. If you have created special digitizing equipment, you may not have to create a special channel component for your equipment—the channel components provided by Apple may be sufficient for your needs. By providing a special panel component, however, you can allow the user to take advantage of your equipment’s special capabilities. 
  11916. If you have created your own channel component, you must create an accompanying panel component to allow the user to configure your channel.
  11917.  
  11918. Creating Sequence Grabber Panel Components
  11919.  
  11920. This section discusses how to create a sequence grabber panel component. You should read this section if you are creating a panel component.
  11921. Applications do not call panel components directly. Rather, they invoke a sequence grabber’s settings dialog box by calling the SGSettingsDialog function. In response, the sequence grabber presents the settings dialog box to the user. When the user selects a specific settings panel, the sequence grabber invokes the appropriate panel component. 
  11922. Panel components provide a number of functions that allow sequence grabbers to manage their relationships with panel components. See “Managing Your Panel Component” beginning on page 7-15 for complete descriptions of these functions.
  11923. Panel components are not responsible for saving their settings information. 
  11924. Sequence grabbers manage this information on behalf of panel components, 
  11925. and a sequence grabber may combine configuration information from several panel components in order to build up the complete configuration for an elaborate digitizing environment. Panel components provide functions that allow sequence grabbers to obtain this configuration information. See “Managing Your Panel’s Settings” beginning on page 7-24 for more information about these functions.
  11926. Sequence grabbers store this configuration data in user data items. The Movie Toolbox provides a number of functions that allow you to create and manage user data items. If you are not familiar with these functions, see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for more information.
  11927. Apple has defined a component type value for sequence grabber panel components. You can use the following constant to specify this component type.
  11928. #define            SeqGrabPanelType 'sgpn'                                /* panel component type */
  11929. Sequence grabber panel components use their component subtype and manufacturer values to indicate the type of configuration services they provide. The subtype value indicates the media type supported by the panel component. This value should correspond to the component subtype value of channel components that may be configured by the panel component. For example, a panel component that manages video settings would have a subtype of 'vide' (this value is defined by the Movie Toolbox’s VideoMediaType constant). 
  11930. The manufacturer field contains a unique identifier for each panel component. The value should indicate something about the specific services provided by the component. For example, Apple has defined the following manufacturer values:
  11931. #define            SeqGrabCompressionPanelType                                        'sour'            /* input source
  11932.                                                                     selection */
  11933. #define            SeqGrabSourcePanelType                                        'cmpr'            /* compression
  11934.                                                                     settings */
  11935. In general, Apple has reserved all lowercase values of component subtypes and manufacturer codes.
  11936. Apple has defined a functional interface for sequence grabber panel components. For information about the functions that your component must support, see “Sequence Grabber Panel Components Reference” beginning on page 7-14. You may use the following constants to refer to the request codes for each of the functions that your component must support:
  11937. enum {
  11938.     /* sequence grabber panel request codes */
  11939.  
  11940.     kSGCPanelGetDitlSelect                                         = 0x200,            /* SGPanelGetDITL */
  11941.     kSGCPanelCanRunSelect                                         = 0x202,            /* SGPanelCanRun */
  11942.     kSGCPanelInstallSelect                                         = 0x203,            /* SGPanelInstall */
  11943.     kSGCPanelEventSelect                                         = 0x204,            /* SGPanelEvent */
  11944.     kSGCPanelItemSelect                                         = 0x205,            /* SGPanelItem */
  11945.     kSGCPanelRemoveSelect                                         = 0x206,            /* SGPanelRemove */
  11946.     kSGCPanelSetGrabberSelect                                         = 0x207,            /* SGPanelSetGrabber */
  11947.     kSGCPanelSetResFileSelect                                         = 0x208,            /* SGPanelSetResFile */
  11948.     kSGCPanelGetSettingsSelect                                         = 0x209,            /* SGPanelGetSettings */
  11949.     kSGCPanelSetSettingsSelect                                         = 0x20A,            /* SGPanelSetSettings */
  11950.     kSGCPanelValidateInputSelect                                         = 0x20B             /* SGPanelValidateInput */
  11951. };
  11952. Before reading the rest of this chapter, you should know how to create components. See the chapter “Component Manager” in Inside Macintosh: More Macintosh Toolbox for a complete discussion of components, how to use them, and how to create them.
  11953. The next section contains sample code for the creation of a sequence grabber panel component that acts as a settings dialog box for PICT images. To create a sequence grabber panel component, you set up the global variables and implement the required Component Manager request codes and the functions that are private to your 
  11954. particular component. Then you manage the dialog box and work with the settings in the dialog box.
  11955. Implementing the Required Component Functions
  11956.  
  11957. Listing 7-1 supplies the component dispatchers for the sequence grabber panel component together with the required functions for open, close, can do, and version.
  11958. Listing 7-1    Implementing the required functions
  11959.  
  11960. #define sgcPictShowTicksType 'TICK'
  11961. typedef struct {
  11962.     ComponentInstance                            self;
  11963.     ControlHandle                            ch;
  11964. } PictPanelGlobalsRecord, *PictPanelGlobals;
  11965. /* only for PICT channels */
  11966. pascal ComponentResult SGSetShowTickCount (SGChannel c, 
  11967.                     Boolean show) = {0x2f3c,2,0x100,0x7000,0xA82A};
  11968. pascal ComponentResult SGGetShowTickCount (SGChannel c, 
  11969.                     Boolean *show) = {0x2f3c,4,0x101,0x7000,0xA82A};
  11970. pascal ComponentResult PictPanelDispatcher
  11971.                     (ComponentParameters *params, Handle storage)
  11972. {
  11973.     OSErr err = badComponentSelector;
  11974.     ComponentFunction componentProc = 0;
  11975.     switch (params->what) {
  11976.  
  11977.         case kComponentOpenSelect: 
  11978.             componentProc = PictPanelOpen; break;
  11979.         case kComponentCloseSelect: 
  11980.             componentProc = PictPanelClose; break;
  11981.         case kComponentCanDoSelect: 
  11982.             componentProc = PictPanelCanDo; break;
  11983.         case kComponentVersionSelect: 
  11984.             componentProc = PictPanelVersion; break;
  11985.         case kSGCPanelGetDitlSelect: 
  11986.             componentProc = PictPanelPanelGetDitl; break;
  11987.         case kSGCPanelInstallSelect: 
  11988.             componentProc = PictPanelPanelInstall; break;
  11989.         case kSGCPanelItemSelect: 
  11990.             componentProc = PictPanelPanelItem; break;
  11991.         case kSGCPanelRemoveSelect: 
  11992.             componentProc = PictPanelPanelRemove; break;
  11993.  
  11994.         case kSGCPanelGetSettingsSelect: 
  11995.             componentProc = PictPanelPanelGetSettings; break;
  11996.         case kSGCPanelSetSettingsSelect: 
  11997.             componentProc = PictPanelPanelSetSettings; break;
  11998.     }
  11999.  
  12000.     if (componentProc)
  12001.         err = CallComponentFunctionWithStorage (storage, params,
  12002.                                                              componentProc);
  12003.  
  12004.     return err;
  12005. }
  12006.  
  12007. pascal ComponentResult PictPanelCanDo (PictPanelGlobals store,
  12008.                                                      short ftnNumber)
  12009. {
  12010.  
  12011.     switch (ftnNumber) {
  12012.         case kComponentOpenSelect: 
  12013.         case kComponentCloseSelect: 
  12014.         case kComponentCanDoSelect: 
  12015.         case kComponentVersionSelect: 
  12016.         case kSGCPanelGetDitlSelect: 
  12017.         case kSGCPanelInstallSelect: 
  12018.         case kSGCPanelItemSelect:
  12019.         case kSGCPanelRemoveSelect: 
  12020.         case kSGCPanelGetSettingsSelect: 
  12021.         case kSGCPanelSetSettingsSelect: 
  12022.             return true;
  12023.         default:
  12024.             return false;
  12025.     }
  12026. }
  12027.  
  12028. pascal ComponentResult PictPanelVersion (PictPanelGlobals store)
  12029. {
  12030.     return 0x00020001;    
  12031. }
  12032. pascal ComponentResult PictPanelOpen (PictPanelGlobals store,
  12033.                                                      ComponentInstance self)
  12034. {
  12035.     OSErr err;
  12036.     /* allocate global variables */
  12037.     store = (PictPanelGlobals) NewPtrClear
  12038.                 (sizeof(PictPanelGlobalsRecord));
  12039.     if (err = MemError()) goto bail;
  12040.     SetComponentInstanceStorage (self, (Handle)store);
  12041.     /* remember the component instance identification number */
  12042.     store->self = self;
  12043.  
  12044. bail:
  12045.     return err;
  12046. }
  12047.  
  12048. pascal ComponentResult PictPanelClose (PictPanelGlobals store,
  12049.                                                     ComponentInstance self)
  12050. {
  12051.     if (store) DisposePtr ((Ptr)store);
  12052.     return noErr;
  12053. }
  12054. Managing the Dialog Box
  12055.  
  12056. This section gives details on the functions that the panel component must provide so that the sequence grabber can load the component’s items into the settings dialog box and receive and process dialog events.
  12057.     1.    To prepare to add the component’s items to the settings dialog box, the sequence grabber obtains the item list by calling the SGPanelGetDITL function (described on page 7-18). 
  12058.     2.    Once it has installed the items, the sequence grabber calls the SGPanelInstall function (described on page 7-19), which sets up the state of the dialog box 
  12059. (for example, a checkbox) and gives the panel component an opportunity to set initial values.
  12060.     3.    When the panel component is loaded into the settings dialog box and active, it may receive and process dialog events and mouse clicks. The component’s SGPanelEvent function (described on page 7-22) processes individual dialog events. 
  12061.     4.    Whenever the user clicks a dialog item, the sequence grabber calls the SGPanelItem function (described on page 7-21).
  12062.     5.    Before the sequence grabber removes the items from the settings dialog box, it calls the SGPanelRemove function (described on page 7-20).
  12063. Listing 7-2 provides an example of the management of the settings dialog box for a sequence grabber that displays PICT images. The component item displayed in the dialog box in this case is a tick count checkbox.
  12064. Listing 7-2    Managing the settings dialog box
  12065.  
  12066. pascal ComponentResult PictPanelPanelGetDitl 
  12067.                                                 (PictPanelGlobals store,
  12068.                                                  Handle *ditl)
  12069. {
  12070.     /* 
  12071.         Get and detach the dialog box template. Note that 
  12072.         the sequence grabber has already opened the resource file. 
  12073.     */
  12074.     *ditl = GetResource ('DITL', 7001); 
  12075.     if (!*ditl) return resNotFound;
  12076.     DetachResource (*ditl);
  12077.     return noErr;
  12078. }
  12079.  
  12080. pascal ComponentResult PictPanelPanelInstall 
  12081.                                 (PictPanelGlobals store, SGChannel c,
  12082.                                  DialogPtr d, short itemOffset)
  12083. {
  12084.     Rect r;
  12085.     short kind;
  12086.     Handle h;
  12087.     Boolean ticksShowing;
  12088.  
  12089.     /* set up the initial state of the checkbox */
  12090.     GetDItem (d, 1 + itemOffset, &kind, &h, &r);
  12091.     store->ch = (ControlHandle)h;
  12092.     SGGetShowTickCount (c, &ticksShowing);
  12093.     SetCtlValue (store->ch, ticksShowing);
  12094.  
  12095.     return noErr;
  12096. }
  12097.  
  12098. pascal ComponentResult PictPanelPanelItem 
  12099.                                 (PictPanelGlobals store, SGChannel c,
  12100.                                  DialogPtr d, short itemOffset, 
  12101.                                  short itemNum)
  12102. {
  12103.     /* if the item clicked was your checkbox, update its state */
  12104.     if ((itemNum - itemOffset) == 1) {
  12105.         Boolean showing = GetCtlValue (store->ch);
  12106.         SetCtlValue (store->ch, !showing);
  12107.         SGSetShowTickCount (c, !showing);
  12108.     }
  12109.  
  12110.     return noErr;
  12111. }
  12112.  
  12113. pascal ComponentResult PictPanelPanelRemove 
  12114.                                         (PictPanelGlobals store, 
  12115.                                         SGChannel c, DialogPtr d, 
  12116.                                         short itemOffset)
  12117. {
  12118.     /* forget that it ever had a control */
  12119.     store->ch = nil;
  12120.     return noErr;
  12121. }
  12122. Managing Your Panel’s Settings
  12123.  
  12124. To allow the sequence grabber to work with your panel’s settings, your panel component must allow the sequence grabber to
  12125. n    retrieve the panel’s current settings by calling your SGPanelGetSettings function (described on page 7-24)
  12126. n    restore those settings to some previous values by using your SGPanelSetSettings function (described on page 7-25)
  12127. Listing 7-3 gives an example in which the settings are managed in a user list that contains tick count information for a panel component for PICT images.
  12128. Listing 7-3    Managing the settings for a panel component
  12129.  
  12130. pascal ComponentResult PictPanelPanelGetSettings 
  12131.                             (PictPanelGlobals store, SGChannel c,
  12132.                              UserData *result, long flags)
  12133. {
  12134.     OSErr                 err;
  12135.     UserData                 ud;
  12136.     Boolean                 ticksShowing;
  12137.     /* create a user data list containing your state */
  12138.     if (err = NewUserData (&ud)) goto bail;
  12139.     if (err = SGGetShowTickCount (c, &ticksShowing)) goto bail;
  12140.     if (err = SetUserDataItem (ud, &ticksShowing, 
  12141.                                         sizeof (ticksShowing),     
  12142.                                         sgcPictShowTicksType, 1)) goto bail;
  12143.  
  12144. bail:
  12145.     if (err) {
  12146.         DisposeUserData(ud);
  12147.         ud = 0;
  12148.     }
  12149.     *result = ud;
  12150.  
  12151.     return err;
  12152. }
  12153.  
  12154. pascal ComponentResult PictPanelPanelSetSettings 
  12155.                                     (PictPanelGlobals store, SGChannel c,
  12156.                                      UserData ud, long flags)
  12157. {
  12158.     Boolean ticksShowing;
  12159.  
  12160.     /* restore the state from the specified user data list */
  12161.     if (GetUserDataItem (ud, &ticksShowing, 
  12162.                                 sizeof (ticksShowing),
  12163.                                 sgcPictShowTicksType, 1) == noErr)
  12164.         SGSetShowTickCount (c, ticksShowing);
  12165.  
  12166.     return noErr;
  12167. }
  12168.  
  12169. Sequence Grabber Panel Components Reference
  12170.  
  12171. This section describes the constants and functions that your sequence grabber panel component may support. Some of these functions are optional—your component should support only those functions that are appropriate to it.
  12172. Component Flags for Sequence Grabber Panel Components
  12173.  
  12174. The Component Manager allows you to specify information about your component’s capabilities in the componentFlags field of the component description record. Sequence grabber panel components use the componentFlags field to indicate specific information about their capabilities. 
  12175. The following flags are currently defined:
  12176. enum {
  12177.     channelFlagDontOpenResFile = 2,                                            /* do not open resource 
  12178.                                                     file */
  12179.     channelFlagHasDependency = 4                                            /* needs special hardware */
  12180. };
  12181. These flags control how sequence grabbers manage their connection with your panel component. The channelFlagDontOpenResFile flag instructs the sequence grabber not to open your component’s resource file. By default, the sequence grabber opens your component’s resource file for you, and then provides you with the appropriate file reference number. In general, this is convenient. However, if your component is linked with your application and does not have its own resource file, you may not want the sequence grabber to try to open the resource file. In such cases, set this flag to 1. 
  12182. The channelFlagHasDependency flag allows you to tell the sequence grabber that your panel component requires special digitizing hardware. If you set this flag to 1, the sequence grabber gives your component an opportunity to verify that it can work in the current hardware environment—by calling your component’s SGPanelCanRun function (described on page 7-17). 
  12183. Functions
  12184.  
  12185. This section describes the functions that may be supported by sequence grabber panel components. It is divided into the following topics:
  12186. n    “Managing Your Panel Component” discusses the functions that allow sequence grabber components to load, configure, and unload your panel component.
  12187. n    “Processing Your Panel’s Events” describes the functions that allow your component to receive and process events in your panel.
  12188. n    “Managing Your Panel’s Settings” tells you about the functions that allow sequence grabber components to collect and reset your panel’s settings.
  12189. Managing Your Panel Component
  12190.  
  12191. Sequence grabber components load, configure, and unload your panel component. As part of this process, the sequence grabber installs your panel’s dialog items into the settings dialog box and may open your component’s resource file. Panel components provide a number of functions that allow the sequence grabber to manage its relationship with panel components. This section discusses those functions.
  12192. After opening a connection to your panel component, the sequence grabber identifies itself to your component by calling your SGPanelSetGrabber function. The sequence grabber then tries to determine whether your component can work with its associated channel component by calling your SGPanelCanRun function. The sequence grabber calls this function only if you have set the channelFlagHasDependency component flag to 1.
  12193. Once the sequence grabber has determined that your panel component can work with its channel component, the sequence grabber may open your component’s resource file (unless you have set the channelFlagDontOpenResFile component flag to 1). Once it has opened the resource file, it passes the file’s reference number to you by calling your SGPanelSetResFile function.
  12194. Next, the sequence grabber prepares to add your component’s items to the 
  12195. settings dialog box. The sequence grabber obtains your item list by calling 
  12196. your SGPanelGetDITL function. Once it has installed the items, it calls your SGPanelInstall function, giving you an opportunity to set initial values.
  12197. Before the sequence grabber removes your items from the settings dialog box, it calls your SGPanelRemove function.
  12198. SGPanelSetGrabber
  12199.  
  12200. The SGPanelSetGrabber function allows a sequence grabber component to identify itself to your panel component. This is typically the first function the sequence grabber component calls after opening your panel component.
  12201. pascal ComponentResult SGPanelSetGrabber             
  12202.                                                 (SeqGrabPanelComponent s,         
  12203.                                                  SeqGrabComponent sg);
  12204. s    Identifies the sequence grabber component’s connection to your panel component.
  12205. sg    Identifies a connection to the sequence grabber component that is using your panel component. Your component may use this connection to call sequence grabber component functions.
  12206. DESCRIPTION
  12207. A sequence grabber component calls your SGPanelSetGrabber function in order to identify itself to your panel component. Your component can use the provided connection to call sequence grabber functions, either to determine the characteristics of the current capture operation or to alter those characteristics. 
  12208. RESULT CODEbadComponentSelector    0x80008002    Function not supported    
  12209.  
  12210. SGPanelCanRun
  12211.  
  12212. The SGPanelCanRun function allows a sequence grabber component to determine whether your panel component can work with the current sequence grabber channel component.
  12213. pascal ComponentResult SGPanelCanRun (SeqGrabPanelComponent s,
  12214.                                                     SGChannel c);
  12215. s    Identifies the sequence grabber component’s connection to your panel component.
  12216. c    Identifies a connection to a sequence grabber channel component. You must determine whether your panel component can operate with this channel component and its associated channel hardware.
  12217. DESCRIPTION
  12218. A sequence grabber component calls your SGPanelCanRun function in order to determine whether your component can work with a specified sequence grabber channel component and its associated hardware. If your component works only with certain hardware, you should support this function. 
  12219. Set the channelFlagHasDependency component flag to 1 to cause the sequence grabber component to call this function.
  12220. The sequence grabber component provides you with a connection to the channel component in question. Your component should query the channel component to determine whether you can operate with it. You may want to use channel component functions to determine the characteristics of the digitization source attached to the channel. If your component can work with the specified channel, return a result code of noErr. Otherwise, return an appropriate sequence grabber or sequence grabber channel component result code.
  12221. If your panel component can only support a limited number of connections, you should regulate the number of active connections in your SGPanelCanRun function. Return a nonzero result code to indicate to the sequence grabber that your panel component cannot support the current connection.
  12222. RESULT CODESnoDeviceForChannel    –9408    Cannot work with specified channel    
  12223. badComponentSelector    0x80008002    Function not supported    
  12224.  
  12225. Other appropriate sequence grabber or sequence grabber channel result codes
  12226. SGPanelSetResFile
  12227.  
  12228. Unless you instruct it otherwise, the sequence grabber component opens your panel component’s resource file for you. The SGPanelSetResFile function allows the sequence grabber to pass you the resource file’s reference number. The sequence grabber also calls this function when it closes your resource file.
  12229. pascal ComponentResult SGPanelSetResFile 
  12230.                                                     (SeqGrabPanelComponent s,
  12231.                                                      short resRef);
  12232. s    Identifies the sequence grabber component’s connection to your panel component.
  12233. resRef    Contains a reference number that identifies your component’s resource file. After it closes your resource file, the sequence grabber component calls this function and sets this value to 0.
  12234. DESCRIPTION
  12235. A sequence grabber component calls your SGPanelSetResFile function in order to pass you your component’s resource file reference number. By default, the sequence grabber component opens your component’s resource file for you. You can use this reference number to retrieve resources from your resource file.
  12236. The sequence grabber component also calls this function when it closes your component’s resource file. In this case, it sets the resRef parameter to 0. Note that the sequence grabber component may close your resource file at any time; you should not count on any particular calling sequence.
  12237. If you do not want the sequence grabber component to open your resource file, set the channelFlagDontOpenResFile component flag to 1.
  12238. SGPanelGetDITL
  12239.  
  12240. The SGPanelGetDITL function allows a sequence grabber component to determine the dialog items managed by your panel component. The sequence grabber uses this information to build the sequence grabber settings dialog box for the user.
  12241. pascal ComponentResult SGPanelGetDITL (SeqGrabPanelComponent s,
  12242.                                                      Handle *ditl);
  12243. s    Identifies the sequence grabber component’s connection to your panel component.
  12244. ditl    Contains a pointer to a handle that is to receive your component’s item list. Your component should resize this handle as appropriate.
  12245. DESCRIPTION
  12246. A sequence grabber component calls your SGPanelGetDITL function in order to obtain the list of dialog items supported by your panel component. The sequence grabber then places these items into the settings dialog box and presents the dialog box to the user. When the sequence grabber builds the settings dialog box, it places your items appropriately—you do not need to specify particular locations for the items.
  12247. Your component returns the item list in a handle that is provided by the sequence grabber component. Note that the sequence grabber component will dispose of this handle after retrieving the item list, so make sure that the item list is not stored in a resource. If your item list is in a resource handle, you can use the Resource Manager’s DetachResource routine to convert that resource handle into a handle that is suitable for use with the SGPanelGetDITL function. 
  12248. The sequence grabber component will open your resource file before calling this function unless you have instructed the sequence grabber component not to open your resource file (that is, you have set the channelFlagDontOpenResFile component flag to 1).
  12249. SGPanelInstall
  12250.  
  12251. A sequence grabber component calls your SGPanelInstall function after adding your items to the settings dialog box, just before it displays the dialog box to the user.
  12252. pascal ComponentResult SGPanelInstall (SeqGrabPanelComponent s, 
  12253.                                                      SGChannel c, DialogPtr d,
  12254.                                                      short itemOffset);
  12255. s    Identifies the sequence grabber component’s connection to your panel component.
  12256. c    Identifies a connection to the sequence grabber channel associated with your panel component.
  12257. d    Contains a dialog pointer identifying the settings dialog box. Your component may use this value to manage its part of the dialog box.
  12258. itemOffset
  12259. Specifies the offset to your panel’s first item in the dialog box. Because sequence grabber components build your dialog items into a larger dialog box containing other items, this value may be different each time your panel component is installed; do not rely on it being the same.
  12260. DESCRIPTION
  12261. A sequence grabber component calls your SGPanelInstall function just before displaying the dialog box to the user. The sequence grabber provides you with information identifying the channel that your panel is to configure, the dialog box, and the offset of your panel’s items into the dialog box. You may use this opportunity to set default dialog values or to initialize your control values.
  12262. SEE ALSO
  12263. Sequence grabber components call your component’s SGPanelRemove function before they remove your panel from the settings dialog box. That function is discussed next. 
  12264. SGPanelRemove
  12265.  
  12266. Sequence grabber components call your component’s SGPanelRemove function before removing your panel from the settings dialog box.
  12267. pascal ComponentResult SGPanelRemove (SeqGrabPanelComponent s,
  12268.                                                      SGChannel c, DialogPtr d,
  12269.                                                     short itemOffset);
  12270. s    Identifies the sequence grabber component’s connection to your panel component.
  12271. c    Identifies a connection to the sequence grabber channel associated with your panel component.
  12272. d    Contains a dialog pointer identifying the settings dialog box. 
  12273. itemOffset
  12274. Specifies the offset to your panel’s first item in the dialog box. 
  12275. DESCRIPTION
  12276. A sequence grabber component calls your SGPanelRemove function just before removing your items from the settings dialog box. The sequence grabber provides you with information identifying the channel your panel is to configure, the dialog box, and the offset of your panel’s items into the dialog box. You may use this opportunity to save any changes you may have made to the dialog box or to retrieve the contents of TextEdit items. 
  12277. If the sequence grabber opened your resource file, it will still be open when it calls this function.
  12278. SEE ALSO
  12279. Sequence grabbers call your SGPanelInstall function (described in the previous section) before displaying the settings dialog box to the user. 
  12280. Processing Your Panel’s Events
  12281.  
  12282. When your panel component is loaded into the settings dialog box and active, you may receive and process dialog events and mouse clicks. 
  12283. Your component’s SGPanelEvent function acts like a modal-dialog filter function, allowing you to process individual dialog events. The sequence grabber calls your SGPanelItem function whenever the user clicks a dialog item.
  12284. Whenever the user clicks the OK button, the sequence grabber calls your SGPanelValidateInput function. Your panel component may then validate the user’s settings.
  12285. SGPanelItem
  12286.  
  12287. Your SGPanelItem function allows your component to receive and process mouse clicks in the settings dialog box.
  12288. pascal ComponentResult SGPanelItem (SeqGrabPanelComponent s,
  12289.                                                  SGChannel c, DialogPtr d,
  12290.                                                  short itemOffset, 
  12291.                                                  short itemNum);
  12292. s    Identifies the sequence grabber component’s connection to your panel component.
  12293. c    Identifies a connection to the sequence grabber channel associated with your panel component.
  12294. d    Contains a dialog pointer identifying the settings dialog box. 
  12295. itemOffset
  12296. Specifies the offset to your panel’s first item in the dialog box. 
  12297. itemNum    Contains the item number of the dialog item selected by the user. Note that this is an absolute item number; the sequence grabber does not adjust this value to account for the offset to your first dialog item.
  12298. DESCRIPTION
  12299. A sequence grabber component calls your SGPanelItem function whenever the user clicks an item in the settings dialog box. Your component may then perform whatever processing is appropriate, depending upon the item number. Note that the sequence grabber provides an absolute item number. It is your responsibility to adjust this value to account for the offset to your panel’s first item in the dialog box.
  12300. SEE ALSO
  12301. Your component can filter all dialog events with your SGPanelEvent function. This function is described next.
  12302. Sequence grabber components use your component’s SGPanelValidateInput function to validate the current input settings as a whole. That function is discussed on page 7-23. 
  12303. SGPanelEvent
  12304.  
  12305. Your SGPanelEvent function allows your component to receive and process dialog events. This function is similar to a modal-dialog filter function.
  12306. pascal ComponentResult SGPanelEvent (SeqGrabPanelComponent s,
  12307.                                                  SGChannel c, DialogPtr d,
  12308.                                                  short itemOffset,
  12309.                                                  EventRecord *theEvent, 
  12310.                                                  short *itemHit,
  12311.                                                  Boolean *handled);
  12312. s    Identifies the sequence grabber component’s connection to your panel component.
  12313. c    Identifies a connection to the sequence grabber channel associated with your panel component.
  12314. d    Contains a dialog pointer identifying the settings dialog box. 
  12315. itemOffset
  12316. Specifies the offset to your panel’s first item in the dialog box. 
  12317. theEvent    Contains a pointer to an event structure. This event structure contains information identifying the nature of the event.
  12318. itemHit    Contains a pointer to a field that is to receive the item number in cases where your component handles the event. The number returned is an absolute, not a relative number, so it must be offset by the itemOffset parameter.
  12319. handled    Contains a pointer to a Boolean value. Set this Boolean value to indicate whether your component handles the event: set it to true if you handle the event; set it to false if you do not.
  12320. DESCRIPTION
  12321. A sequence grabber component calls your SGPanelEvent function whenever an event occurs in the settings dialog box. Your SGPanelEvent function is similar to a modal- dialog filter function. The main difference is that, rather than returning a Boolean value to indicate whether you handled the event, your SGPanelEvent function sets a Boolean value that is provided by the calling function. If you handle the event, be sure to update the field referred to by the itemHit parameter.
  12322. SEE ALSO
  12323. Your component can process mouse clicks with your SGPanelItem function. This function is discussed on page 7-21.
  12324. SGPanelValidateInput
  12325.  
  12326. Sequence grabber components call your component’s SGPanelValidateInput function in order to allow you to validate the contents of the user dialog box.
  12327. pascal ComponentResult SGPanelValidateInput
  12328.                                              (SeqGrabPanelComponent s,
  12329.                                                  Boolean *ok);
  12330. s    Identifies the sequence grabber component’s connection to your panel component.
  12331. ok    Contains a pointer to a Boolean value. You set this Boolean value to indicate whether the user’s settings are acceptable. Set it to true if the settings are OK; otherwise, set it to false.
  12332. DESCRIPTION
  12333. A sequence grabber component calls your SGPanelValidateInput function in order to allow you to validate the settings chosen by the user. This is your opportunity to validate the settings in their entirety, including those for which you may not have received dialog events or mouse clicks. For example, if your panel component uses a TextEdit box, you should validate its contents at this time. Be sure to give the user some indication of what to do to fix the settings.
  12334. The sequence grabber calls this function when the user clicks the OK button. If the user clicks the Cancel button, the sequence grabber does not call this function.
  12335. You indicate whether the settings are acceptable by setting the Boolean value referred to by the ok parameter. If you set this Boolean value to false, the sequence grabber component ignores the OK button in the dialog box.
  12336. SEE ALSO
  12337. Your component can process mouse clicks with your SGPanelItem function, described on page 7-21. Your component can filter all dialog events with your SGPanelEvent function, described in the previous section.
  12338. Managing Your Panel’s Settings
  12339.  
  12340. Sequence grabber components store their configuration information in Movie Toolbox user data items (see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for more information about user data items). This configuration information includes settings for each of the channels used by the sequence grabber. Because your panel component configures sequence grabber channels, your panel component is responsible for creating and formatting the contents of its user data items. The sequence grabber component calls your component whenever it wants to retrieve these settings. The sequence grabber may also use previously stored settings to restore your panel’s settings. This section discusses the functions that allow the sequence grabber to work with your panel’s settings.
  12341. The sequence grabber calls your SGPanelGetSettings function in order to retrieve your panel’s current settings. The sequence grabber uses your SGPanelSetSettings function to restore those settings to some previous values.
  12342. SGPanelGetSettings
  12343.  
  12344. Sequence grabber components call your component’s SGPanelGetSettings function in order to retrieve your panel’s current settings.
  12345. pascal ComponentResult SGPanelGetSettings 
  12346.                                             (SeqGrabPanelComponent s,
  12347.                                              SGChannel c, UserData *ud, 
  12348.                                              long flags);
  12349. s    Identifies the sequence grabber component’s connection to your panel component.
  12350. c    Identifies a connection to the sequence grabber channel associated with your panel component.
  12351. ud    Contains a pointer to a user data item. Your component is responsible for creating a new user data item and returning that item by means of this pointer. Your component is not responsible for disposing of the user data item.
  12352. flags    Reserved for future use.
  12353. DESCRIPTION
  12354. A sequence grabber component calls your SGPanelGetSettings function in order to obtain a copy of your panel’s current settings. The sequence grabber stores these settings for you and may use them to restore your panel’s settings by calling your SGPanelSetSettings function (described next). Your component should store whatever values are necessary to properly configure your associated channel component. For example, Apple’s video compression panel component saves such values as video compressor component type, compression quality, key frame rate, and frame rate values.
  12355. These settings may be stored as part of a larger sequence grabber configuration and may be stored for a long period of time. Therefore, you should not store values that may change without your knowledge (such as component ID or connection values).
  12356. You are free to format the data in the user data item in any way you desire. Make 
  12357. sure you can retrieve the settings information from the user data item when your SGPanelGetSettings function is called. You may choose to format the data in such a way that other components can parse it easily, thus allowing your component to operate with other panel components.
  12358. You create a new user data item by calling the Movie Toolbox’s NewUserData function (see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for more information about this function). You may then use other Movie Toolbox functions to manipulate the user data item.
  12359. SEE ALSO
  12360. Sequence grabber components use your component’s SGPanelSetSettings function to restore this configuration information. That function is discussed next. 
  12361. SGPanelSetSettings
  12362.  
  12363. Sequence grabber components call your component’s SGPanelSetSettings function in order to restore your panel’s current settings.
  12364. pascal ComponentResult SGPanelSetSettings 
  12365.                                             (SeqGrabPanelComponent s,
  12366.                                              SGChannel c, UserData ud, 
  12367.                                              long flags);
  12368. s    Identifies the sequence grabber component’s connection to your panel component.
  12369. c    Identifies a connection to the sequence grabber channel associated with your panel component.
  12370. ud    Identifies a user data item that contains new settings information for your panel. Your component must not dispose of this user data item.
  12371. flags    Reserved for future use.
  12372. DESCRIPTION
  12373. A sequence grabber component calls your SGPanelSetSettings function in order to restore your panel’s settings. The sequence grabber may call this function when the user cancels the settings dialog box. 
  12374. Your component originally creates the settings information when the sequence grabber calls your SGPanelGetSettings function (described in the previous section). The sequence grabber passes this configuration information back to you in the ud parameter to this function. Your component should parse the configuration information and use 
  12375. it to establish your panel’s current settings.
  12376. Note that your component may not be able to accommodate the original settings. For example, because the settings may have been stored for some time, the hardware environment may not be able to support the values in the settings. You should try to make your new settings match the original settings as closely as possible. If you cannot get close enough, return an appropriate sequence grabber or sequence grabber channel result code.
  12377. You may use Movie Toolbox functions to manipulate the user data item (see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for more information about functions that work with user data items).
  12378. RESULT CODESnoDeviceForChannel    –9408    Device cannot support settings    
  12379.  
  12380. Other appropriate sequence grabber or sequence grabber channel result codes
  12381. SEE ALSO
  12382. Sequence grabber components use your component’s SGPanelGetSettings function (described in the previous section) to retrieve the configuration information. 
  12383.  
  12384.  
  12385. Summary of Sequence Grabber Panel Components
  12386.  
  12387. C Summary
  12388.  
  12389. Constants
  12390.  
  12391. /*    component type value */
  12392. #define            SeqGrabPanelType 'sgpn'                                    /* panel component type */
  12393.  
  12394. /*    component manufacturer code values */
  12395. #define            SeqGrabCompressionPanelType                                        'sour'            /* input source selection */
  12396. #define            SeqGrabSourcePanelType                                         'cmpr'            /* compression settings */
  12397.  
  12398. /*    componentFlags values for sequence grabber panel components */
  12399. enum {
  12400.     channelFlagDontOpenResFile                                    = 2,        /* do not open resource file */
  12401.     channelFlagHasDependency                                     = 4        /* needs special hardware */
  12402. };
  12403.  
  12404. enum {
  12405.     /* sequence grabber panel request codes */
  12406.     kSGCPanelGetDitlSelect                                         = 0x200,            /* SGPanelGetDITL */
  12407.     kSGCPanelCanRunSelect                                         = 0x202,            /* SGPanelCanRun */
  12408.     kSGCPanelInstallSelect                                         = 0x203,            /* SGPanelInstall */
  12409.     kSGCPanelEventSelect                                         = 0x204,            /* SGPanelEvent */
  12410.     kSGCPanelItemSelect                                         = 0x205,            /* SGPanelItem */
  12411.     kSGCPanelRemoveSelect                                         = 0x206,            /* SGPanelRemove */
  12412.     kSGCPanelSetGrabberSelect                                         = 0x207,            /* SGPanelSetGrabber */
  12413.     kSGCPanelSetResFileSelect                                         = 0x208,            /* SGPanelSetResFile */
  12414.     kSGCPanelGetSettingsSelect                                         = 0x209,            /* SGPanelGetSettings */
  12415.     kSGCPanelSetSettingsSelect                                         = 0x20A,            /* SGPanelSetSettings */
  12416.     kSGCPanelValidateInputSelect                                         = 0x20B             /* SGPanelValidateInput */
  12417. };
  12418. Functions
  12419.  
  12420. Managing Your Panel Component
  12421. pascal ComponentResult SGPanelSetGrabber
  12422. (SeqGrabPanelComponent s, SeqGrabComponent sg);
  12423. pascal ComponentResult SGPanelCanRun
  12424. (SeqGrabPanelComponent s, SGChannel c);
  12425. pascal ComponentResult SGPanelSetResFile
  12426. (SeqGrabPanelComponent s, short resRef);
  12427. pascal ComponentResult SGPanelGetDITL
  12428. (SeqGrabPanelComponent s, Handle *ditl);
  12429. pascal ComponentResult SGPanelInstall
  12430. (SeqGrabPanelComponent s, SGChannel c, DialogPtr d, short itemOffset);
  12431. pascal ComponentResult SGPanelRemove
  12432. (SeqGrabPanelComponent s, SGChannel c, DialogPtr d, short itemOffset);
  12433. Processing Your Panel’s Events
  12434. pascal ComponentResult SGPanelItem
  12435. (SeqGrabPanelComponent s, SGChannel c, DialogPtr d, short itemOffset, short itemNum);
  12436. pascal ComponentResult SGPanelEvent
  12437. (SeqGrabPanelComponent s, SGChannel c, DialogPtr d, short itemOffset, 
  12438. EventRecord *theEvent, short *itemHit, Boolean *handled);
  12439. pascal ComponentResult SGPanelValidateInput
  12440. (SeqGrabPanelComponent s, Boolean *ok);
  12441. Managing Your Panel’s Settings
  12442. pascal ComponentResult SGPanelGetSettings
  12443. (SeqGrabPanelComponent s, SGChannel c, 
  12444. UserData *ud, long flags);
  12445. pascal ComponentResult SGPanelSetSettings
  12446. (SeqGrabPanelComponent s, SGChannel c, 
  12447. UserData ud, long flags);
  12448. Pascal Summary
  12449.  
  12450. Constants
  12451.  
  12452. CONST
  12453.     {component type value}
  12454.     SeqGrabPanelType                                             = 'sgpn';                {panel component type}
  12455.     {component manufacturer code values}
  12456.     SeqGrabCompressionPanelType                                             = 'comp';                {compression settings}
  12457.     SeqGrabSourcePanelType                                            = 'sour';                {input source slection}
  12458.     {componentFlags values for sequence grabber panel components}
  12459.     channelFlagDontOpenResFile                                        = 2;        {do not open resource file}
  12460.     channelFlagHasDependency                                        = 4;        {channel has special hardware}
  12461.     {sequence grabber panel component request codes}
  12462.     kSGCPanelGetDitlSelect                                            = $200;            {SGCPanelGetDitl}
  12463.     kSGCPanelCanRunSelect                                            = $202;            {SGCPanelCanRun}
  12464.     kSGCPanelInstallSelect                                            = $203;            {SGCPanelInstall}
  12465.     kSGCPanelEventSelect                                            = $204;            {SGCPanelEvent}
  12466.     kSGCPanelItemSelect                                            = $205;            {SGCPanelItem}
  12467.     kSGCPanelRemoveSelect                                            = $206;            {SGCPanelRemove}
  12468.     kSGCPanelSetGrabberSelect                                            = $207;            {SGCPanelSetGrabber}
  12469.     kSGCPanelSetResFileSelect                                            = $208;            {SGCPanelSetResFile}
  12470.     kSGCPanelGetSettingsSelect                                            = $209;            {SGCPanelGetSettings}
  12471.     kSGCPanelSetSettingsSelect                                            = $20A;            {SGCPanelSetSettings}
  12472.     kSGCPanelValidateInputSelect                                             = $20B;            {SGCPanelValidateInput}
  12473. Routines
  12474.  
  12475. Managing Your Panel Component
  12476. FUNCTION SGPanelSetGrabber    (s: SeqGrabComponent; sg: SeqGrabComponent): ComponentResult;
  12477. FUNCTION SGPanelCanRun    (s: SeqGrabComponent; c: SGChannel): ComponentResult;
  12478. FUNCTION SGPanelSetResFile    (s: SeqGrabComponent; resRef: Integer): ComponentResult;
  12479. FUNCTION SGPanelGetDITL    (s: SeqGrabComponent; VAR ditl: Handle):
  12480. ComponentResult;
  12481. FUNCTION SGPanelInstall     (s: SeqGrabComponent; c: SGChannel; 
  12482. d: DialogPtr; itemOffset: Integer): ComponentResult;
  12483. FUNCTION SGPanelRemove    (s: SeqGrabComponent; c: SGChannel; 
  12484. d: DialogPtr; itemOffset: Integer): ComponentResult;
  12485. Processing Your Panel’s Events
  12486. FUNCTION SGPanelItem    (s: SeqGrabComponent; c: SGChannel; 
  12487. d: DialogPtr; itemOffset: Integer; 
  12488. itemNum: Integer): ComponentResult;
  12489. FUNCTION SGPanelEvent    (s: SeqGrabComponent; c: SGChannel; 
  12490. d: DialogPtr; itemOffset: Integer; 
  12491. VAR theEvent: EventRecord; 
  12492. VAR itemHit: Integer; 
  12493. VAR handled: Boolean): ComponentResult;
  12494. FUNCTION SGPanelValidateInput
  12495. (s: SeqGrabComponent; VAR ok: Boolean): ComponentResult;
  12496. Managing Your Panel’s Settings
  12497. FUNCTION SGPanelGetSettings    (s: SeqGrabComponent; c: SGChannel; 
  12498. VAR ud: UserData; flags: LongInt): ComponentResult;
  12499. FUNCTION SGPanelSetSettings    (s: SeqGrabComponent; c: SGChannel; 
  12500. ud: UserData; flags: LongInt): ComponentResult;
  12501. Result CodesnoDeviceForChannel    –9408    Cannot work with specified channel    
  12502. badComponentSelector    0x80008002    Function not supported    
  12503.  
  12504. Listing 8-0
  12505. Table 8-0
  12506. Video Digitizer Components
  12507. Contents
  12508. About Video Digitizer Components8-3
  12509. Types of Video Digitizer Components8-5
  12510. Source Coordinate Systems8-6
  12511. Using Video Digitizer Components8-7
  12512. Specifying Destinations8-7
  12513. Starting and Stopping the Digitizer8-7
  12514. Multiple Buffering8-8
  12515. Obtaining an Accurate Time of Frame Capture8-8
  12516. Creating Video Digitizer Components8-8
  12517. Component Type and Subtype Values8-11
  12518. Required Functions8-11
  12519. Optional Functions8-12
  12520. Frame Grabbers Without Playthrough8-12
  12521. Frame Grabbers With Hardware Playthrough8-12
  12522. Key Color and Alpha Channel Devices8-13
  12523. Compressed Source Devices8-13
  12524. Video Digitizer Components Reference8-14
  12525. Constants8-14
  12526. Capability Flags8-14
  12527. Current Flags8-19
  12528. Data Types8-20
  12529. The Digitizer Information Structure8-20
  12530. The Buffer List Structure8-22
  12531. The Buffer Structure8-23
  12532. Video Digitizer Component Functions8-23
  12533. Getting Information About Video Digitizer Components8-24
  12534. Setting Source Characteristics8-26
  12535. Selecting an Input Source8-30
  12536. Setting Video Destinations8-34
  12537. Controlling Compressed Source Devices8-42
  12538. Controlling Digitization8-52
  12539. Controlling Color8-60
  12540. Controlling Analog Video8-65
  12541. Selectively Displaying Video8-81
  12542. Clipping8-89
  12543. Utility Functions8-92
  12544. Application-Defined Function8-98
  12545. Summary of Video Digitizer Components8-99
  12546. C Summary8-99
  12547. Constants8-99
  12548. Data Types8-104
  12549. Video Digitizer Component Functions8-105
  12550. Application-Defined Function8-111
  12551. Pascal Summary8-111
  12552. Constants8-111
  12553. Data Types8-116
  12554. Video Digitizer Component Routines8-117
  12555. Application-Defined Routine8-123
  12556. Result Codes8-124
  12557.  
  12558. Video Digitizer Components
  12559.  
  12560. This chapter discusses video digitizer components. Video digitizer components provide an interface for obtaining digitized video from an analog video source. In QuickTime, the typical client of a video digitizer component is a sequence grabber component (sequence grabber components are described in the chapter “Sequence Grabber Components” in this book). Sequence grabber components use the services of video digitizer components and image compressor components to create a simple interface for making and previewing movies. However, video digitizer components can also operate independently, placing video into a window. 
  12561. IMPORTANT
  12562. Most applications never need to communicate directly with a video digitizer component. It is strongly advised that your application use the sequence grabber component instead; it isolates you from the myriad of details associated with video digitization.s
  12563.  
  12564. This chapter has been divided into the following major sections:
  12565. n    “About Video Digitizer Components” presents some general information about video digitizer components.
  12566. n    “Using Video Digitizer Components” gives details on how you tell the digitizer where to put the data and how to control digitization. It describes a technique for improving performance.
  12567. n    “Creating Video Digitizer Components” discusses how to create a video digitizer component.
  12568. n    “Video Digitizer Components Reference” describes the constants, data structures, and functions associated with video digitizer components.
  12569. n    “Summary of Video Digitizer Components” supplies a summary of the constants, data types, and functions associated with video digitizer components in C and in Pascal.
  12570.  
  12571. About Video Digitizer Components
  12572.  
  12573. Video digitizer components convert video input into a digitized color image that is compatible with the graphics system of a computer. For example, a video digitizer may convert input analog video into a specified digital format. The input may be any video format and type, whereas the output must be intelligible to the Macintosh computer’s display system. Once the digitizer has converted the input signal to an appropriate digital format, it then prepares the image for display by resizing the image, performing necessary color conversions, and clipping to the output window. At the end of this process, the digitizer component places the converted image into a buffer you specify—if that buffer is the current frame buffer, the image appears on the user’s computer screen.
  12574. Figure 8-1 shows the steps involved in converting the analog video signal to digital format and preparing the digital data for display. Some video digitizer components perform all these steps in hardware. Others perform some or all of these steps in software. Others may perform only a few of these steps—in which case, it is up to the program that is using the video digitizer to perform these tasks.
  12575.  
  12576. Figure 8-1    Basic tasks of a video digitizer
  12577.  
  12578. Video digitizer components resize the image by applying a transformation matrix to the digitized image. Your application specifies the matrix that is applied to the image. Matrix operations can enlarge or shrink an image, distort the image, or move the location of an image. The Movie Toolbox provides a set of functions that make it easy for you to work with transformation matrices. See the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for more information about matrix operations.
  12579. Before the digitized image can be displayed on your computer, the video digitizer component must convert the image into an appropriate color representation. This conversion may involve dithering or pixel depth conversion. The digitizer component handles this conversion based on the destination characteristics you specify.
  12580. Video digitizer components may support clipping. Digitizers that do support clipping can display the resulting image in regions of arbitrary shapes. See the next section for a complete discussion of the techniques that digitizer components can use to perform clipping.
  12581.  
  12582.  
  12583. Types of Video Digitizer Components
  12584.  
  12585. Video digitizer components fall into four categories, distinguished by their support for clipping a digitized video image:
  12586. n    basic digitizers, which do not support clipping
  12587. n    alpha channel digitizers, which clip by means of an alpha channel
  12588. n    mask plane digitizers, which clip by means of a mask plane
  12589. n    key color digitizers, which clip by means of key colors
  12590. Basic video digitizer components are capable of placing the digitized video into memory, but they do not support any graphics overlay or video blending. If you want to perform these operations, you must do so in your application. For example, you can stop the digitizer after each frame and do the work necessary to blend the digitized video with a graphics image that is already being displayed. Unfortunately, this may cause jerkiness or discontinuity in the video stream. Other types of digitizers that support clipping make this operation much easier for your application.
  12591. Alpha channel digitizer components use a portion of each display pixel to represent the blending of video and graphical image data. This part of each pixel is referred to as an alpha channel. The size of the alpha channel differs depending upon the number of bits used to represent each pixel. For 32 bits per pixel modes, the alpha channel is represented in the 8 high-order bits of each 32-bit pixel. These 8 bits can define up to 
  12592. 256 levels of blend. For 16 bits per pixel modes, the alpha channel is represented in the high-order bit of the pixel and defines one level of blend (on or off).
  12593. Mask plane digitizer components use a pixel map to define blending. Values in this mask correspond to pixels on the screen, and they define the level of blend between video and graphical image data.
  12594. Key color digitizer components determine where to display video data based upon the color currently being displayed on the output device. These digitizers reserve one or more colors in the color table; these colors define where to display video. For example, if blue is reserved as the key color, the digitizer replaces all blue pixels in the display rectangle with the corresponding pixels of video from the input video source.
  12595.  
  12596.  
  12597. Source Coordinate Systems
  12598.  
  12599. Your application can control what part of the source video image is extracted. The digitizer then converts the specified portion of the source video signal into a digital format for your use. Video digitizer components define four areas you may need to manipulate when you define the source image for a given operation. These areas are 
  12600. n    the maximum source rectangle
  12601. n    the active source rectangle
  12602. n    the vertical blanking rectangle
  12603. n    the digitizer rectangle
  12604. Figure 8-2 shows the relationships between these rectangles.
  12605.  
  12606. Figure 8-2    Video digitizer rectangles
  12607.  
  12608. The maximum source rectangle defines the maximum source area that the digitizer component can grab. This rectangle usually encompasses both the vertical and horizontal blanking areas. The active source rectangle defines that portion of the maximum source rectangle that contains active video. The vertical blanking rectangle defines that portion of the input video signal that is devoted to vertical blanking. This rectangle occupies lines 10 through 19 of the input signal. Broadcast video sources may use this portion of the input signal for closed captioning, teletext, and other nonvideo information. Note that the blanking rectangle might not be contained in the maximum source rectangle.
  12609. You specify the digitizer rectangle, which defines that portion of the active source rectangle that you want to capture and convert.
  12610.  
  12611.  
  12612. Using Video Digitizer Components
  12613.  
  12614. This section describes how you can control a video digitizer component. It has been divided into the following topics:
  12615. n    “Specifying Destinations” discusses how you tell the digitizer where to put the converted video data.
  12616. n    “Starting and Stopping the Digitizer” discusses how you control digitization.
  12617. n    “Multiple Buffering” describes a technique for improving performance.
  12618. n    “Obtaining an Accurate Time of Frame Capture” tells how the sequence grabber usually supplies video digitizers with a time base. This time base lets your application get an accurate time for the capture of any specified frame.
  12619.  
  12620. Specifying Destinations
  12621.  
  12622. Video digitizer components provide several functions that allow applications to specify the destination for the digitized video stream produced by the digitizer component. You have two options for specifying the destination for the video data stream in your application. 
  12623. The first option requires that the video be digitized as RGB pixels and placed into a destination pixel map. This option allows the video to be placed either onscreen or offscreen, depending upon the placement of the pixel map. Your application can use the VDSetPlayThruDestination function (described on page 8-35) to set the characteristics for this option. Your application can use the VDPreflightDestination function (described on page 8-36) to determine the capabilities of the digitizer. All video digitizer components must support this option.
  12624. The second option uses a global boundary rectangle to define the destination for the video. This option always results in onscreen images and is useful with digitizers that support hardware direct memory access (DMA) across multiple screens. The digitizer component is responsible for any required color depth conversions, image clipping and resizing, and so on. Your application can use the VDSetPlayThruGlobalRect function (described on page 8-39) to set the characteristics for this option. Your application can use the VDPreflightGlobalRect function (described on page 8-40) to determine the capabilities of the digitizer. Not all video digitizer components support this option. 
  12625.  
  12626. Starting and Stopping the Digitizer
  12627.  
  12628. You can control digitization on a frame-by-frame basis in your application. The VDGrabOneFrame function (described on page 8-54) digitizes a single video frame. All video digitizer components support this function.
  12629. Alternatively, you can use the VDSetPlayThruOnOff function (described on page 8-53) to enable or disable digitization. When digitization is enabled, the video digitizer component places video into the specified destination continuously. The application stops the digitizer by disabling digitization. This function can be used with both destination options. However, not all video digitizer components support this function.
  12630.  
  12631. Multiple Buffering
  12632.  
  12633. You can improve the performance of frame-by-frame digitization by using 
  12634. multiple destination buffers for the digitized video. Your application defines a number of destination buffers to the video digitizer component and specifies the order in which those buffers are to be used. The digitizer component then fills the buffers, allowing you to switch between the buffers more quickly than your application otherwise could. In this manner, you can grab a video sequence at a higher rate with less chance of data loss. This technique can be used with both destination options.
  12635. You define the buffers to the digitizer by calling the VDSetupBuffers function (described on page 8-54). The VDGrabOneFrameAsync function (described on page 8-56) starts the process of grabbing a single video frame. The VDDone function (described on page 8-58) allows you to determine when the digitizer component has finished a given frame. 
  12636.  
  12637. Obtaining an Accurate Time of Frame Capture
  12638.  
  12639. The sequence grabber typically gives video digitizers a time base so your application can obtain an accurate time for the capture of any given frame. Applications can set the digitizer’s time base by calling the VDSetTimeBase function, which is described on page 8-51. 
  12640.  
  12641. Creating Video Digitizer Components
  12642.  
  12643. Video digitizer components are the most convenient mechanism for presenting new sources of video data to QuickTime. For example, if you are developing special-purpose video hardware that digitizes video images from a previously unsupported source device, you should create a video digitizer component so that applications or sequence grabber components can obtain data from your device.
  12644. Refer to the chapter “Component Manager” in Inside Macintosh: More Macintosh Toolbox for a general discussion of how to create a component.
  12645. The remaining topics in this section discuss issues you should consider when creating a video digitizer component.
  12646. Apple has defined a functional interface for video digitizer components. For information about the functions your digitizer component must support, see “Video Digitizer Component Functions” beginning on page 8-23. 
  12647. You can use the following enumerators to refer to the request codes for each of the functions that your component must support.
  12648. enum {
  12649.     /* video digitizer interface */
  12650.     kSelectVDGetMaxSrcRect                                                = 0x1,        /* VDGetMaxSrcRect (required) */
  12651.     kSelectVDGetActiveSrcRect                                                = 0x2,        /* VDGetActiveSrcRect 
  12652.                                                                 (required) */
  12653.     kSelectVDSetDigitizerRect                                                 = 0x3,        /* VDSetDigitizerRect 
  12654.                                                                 (required) */
  12655.     kSelectVDGetDigitizerRect                                                 = 0x4,        /* VDGetDigitizerRect 
  12656.                                                                 (required) */
  12657.     kSelectVDGetVBlankRect                                                 = 0x5,        /* VDGetVBlankRect (required) */
  12658.     kSelectVDGetMaskPixMap                                                 = 0x6,        /* VDGetMaskPixMap */
  12659.     kSelectVDGetPlayThruDestination                                                 = 0x8,        /* VDGetPlayThruDestination
  12660.                                                                 (required) */
  12661.     kSelectVDUseThisCLUT                                                 = 0x9,        /* VDUseThisCLUT */
  12662.     kSelectVDSetInputGammaValue                                                 = 0xA,        /* VDSetInputGammaValue */
  12663.     kSelectVDGetInputGammaValue                                                 = 0xB,        /* VDGetInputGammaValue */
  12664.     kSelectVDSetBrightness                                                 = 0xC,        /* VDSetBrightness */
  12665.     kSelectVDGetBrightness                                                 = 0xD,        /* VDGetBrightness */
  12666.     kSelectVDSetContrast                                                 = 0xE,        /* VDSetContrast */
  12667.     kSelectVDSetHue                                                 = 0xF,        /* VDSetHue */
  12668.     kSelectVDSetSharpness                                                 = 0x10,        /* VDSetSharpness */
  12669.     kSelectVDSetSaturation                                                 = 0x11,        /* VDSetSaturation */
  12670.     kSelectVDGetContrast                                                 = 0x12,        /* VDGetContrast */
  12671.     kSelectVDGetHue                                                 = 0x13,        /* VDGetHue */
  12672.     kSelectVDGetSharpness                                                 = 0x14,    /* VDGetSharpness */
  12673.     kSelectVDGetSaturation                                                 = 0x15,        /* VDGetSaturation */
  12674.     kSelectVDGrabOneFrame                                                 = 0x16,        /* VDGrabOneFrame 
  12675.                                                                 (required) */
  12676.     kSelectVDGetMaxAuxBuffer                                                 = 0x17,        /* VDGetMaxAuxBuffer */
  12677.     kSelectVDGetDigitizerInfo                                                 = 0x19,        /* VDGetDigitizerInfo 
  12678.                                                                 (required) */
  12679.     kSelectVDGetCurrentFlags                                                 = 0x1A,        /* VDGetCurrentFlags
  12680.                                                                 (required) */
  12681.     kSelectVDSetKeyColor                                                 = 0x1B,        /* VDSetKeyColor */
  12682.     kSelectVDGetKeyColor                                                 = 0x1C,        /* VDGetKeyColor */
  12683.     kSelectVDAddKeyColor                                                 = 0x1D,        /* VDAddKeyColor */
  12684.     kSelectVDGetNextKeyColor                                                 = 0x1E,        /* VDGetNextKeyColor */
  12685.     kSelectVDSetKeyColorRange                                                 = 0x1F,        /* VDSetKeyColorRange */
  12686.     kSelectVDGetKeyColorRange                                                 = 0x20,        /* VDGetKeyColorRange */
  12687.     kSelectVDSetDigitizerUserInterrupt                                                 = 0x21,
  12688.                                                         /* VDSetDigitizerUserInterrupt */
  12689.     kSelectVDSetInputColorSpaceMode                                                 = 0x22,        /* VDSetInputColorSpaceMode */
  12690.     kSelectVDGetInputColorSpaceMode                                                 = 0x23,        /* VDGetInputColorSpaceMode */
  12691.     kSelectVDSetClipState                                                 = 0x24,        /* VDSetClipState */
  12692.     kSelectVDSetClipState                                                 = 0x25,        /* VDGetClipState */
  12693.     kSelectVDSetClipRgn                                                 = 0x26,        /* VDSetClipRgn */
  12694.     kSelectVDClearClipRgn                                                 = 0x27,        /* VDClearClipRgn */
  12695.     kSelectVDGetCLUTInUse                                                 = 0x28,        /* VDGetCLUTInUse */
  12696.     kSelectVDSetPLLFilterType                                                 = 0x29,        /* VDSetPLLFilterType */
  12697.     kSelectVDGetPLLFilterType                                                 = 0x2A,        /* VDGetPLLFilterType */
  12698.     kSelectVDGetMaskandValue                                                 = 0x2B,        /* VDGetMaskandValue */
  12699.     kSelectVDSetMasterBlendLevel                                                 = 0x2C,        /* VDSetMasterBlendLevel */
  12700.     kSelectVDSetPlayThruDestination                                                 = 0x2D,        /* VDSetPlayThruDestination */
  12701.     kSelectVDSetPlayThruOnOff                                                 = 0x2E,        /* VDSetPlayThruOnOff */
  12702.     kSelectVDSetFieldPreference                                                 = 0x2F,        /* VDSetFieldPreference
  12703.                                                                 (required) */
  12704.     kSelectVDGetFieldPreference                                                 = 0x30,        /* VDGetFieldPreference
  12705.                                                                 (required) */
  12706.     kSelectVDPreflightDestination                                                 = 0x32,        /* VDPreflightDestination
  12707.                                                                 (required) */
  12708.     kSelectVDPreflightGlobalRect                                                 = 0x33,        /* VDPreflightGlobalRect */
  12709.     kSelectVDSetPlayThruGlobalRect                                                 = 0x34,        /* VDSetPlayThruGlobalRect */
  12710.     kSelectVDSetInputGammaRecord                                                 = 0x35,        /* VDSetInputGammaRecord */
  12711.     kSelectVDGetInputGammaRecord                                                 = 0x36,        /* VDGetInputGammaRecord */
  12712.     kSelectVDSetBlackLevelValue                                                 = 0x37,    /* VDSetBlackLevelValue */
  12713.     kSelectVDGetBlackLevelValue                                                 = 0x38,        /* VDGetBlackLevelValue */
  12714.     kSelectVDSetWhiteLevelValue                                                 = 0x39,        /* VDSetWhiteLevelValue */
  12715.     kSelectVDGetWhiteLevelValue                                                 = 0x3A,        /* VDGetWhiteLevelValue */
  12716.     kSelectVDGetVideoDefaults                                                 = 0x3B,        /* VDGetVideoDefaults */
  12717.     kSelectVDGetNumberOfInputs                                                 = 0x3C,    /* VDGetNumberOfInputs */
  12718.     kSelectVDGetInputFormat                                                 = 0x3D,        /* VDGetInputFormat */
  12719.     kSelectVDSetInput                                                 = 0x3E,        /* VDSetInput */
  12720.     kSelectVDGetInput                                                 = 0x3F,        /* VDGetInput */
  12721.     kSelectVDSetInputStandard                                                 = 0x40,        /* VDSetInputStandard */
  12722.     kSelectVDSetupBuffers                                                 = 0x41,        /* VDSetupBuffers */
  12723.     kSelectVDGrabOneFrameAsync                                                 = 0x42,        /* VDGrabOneFrameAsync */
  12724.     kSelectVDDone                                                 = 0x43,        /* VDDone */
  12725.     kSelectVDSetCompression                                                 = 0x44,        /* VDSetCompression */
  12726.     kSelectVDCompressOneFrameAsync                                                 = 0x45,        /* VDCompressOneFrameAsync */
  12727.     kSelectVDCompressDone                                                 = 0x46,        /* VDCompressDone */
  12728.     kSelectVDReleaseCompressBuffer                                                 = 0x47,        /* VDReleaseCompressBuffer */
  12729.     kSelectVDGetImageDescription                                                 = 0x48,        /* VDGetImageDescription */
  12730.     kSelectVDResetCompressSequence                                                 = 0x49,        /* VDResetCompressSequence */
  12731.     kSelectVDSetCompressionOnOff                                                 = 0x4A,        /* VDSetCompressionOnOff */
  12732.     kSelectVDGetCompressionTypes                                                 = 0x4B,        /* VDGetCompressionTypes */
  12733.     kSelectVDSetTimeBase                                                 = 0x4C,        /* VDSetTimeBase */
  12734.     kSelectVDSetFrameRate                                                 = 0x4D,        /* VDSetFrameRate */
  12735.     kSelectVDGetDataRate                                                 = 0x4E,        /* VDGetDataRate */
  12736.     kSelectVDGetSoundInputDriver                                                 = 0x4F,        /* VDGetSoundInputDriver */
  12737.     kSelectVDGetDMADepths                                                 = 0x50,        /* VDGetDMADepths */
  12738.     kSelectVDGetPreferredTimeScale                                                 = 0x51,        /* VDGetPreferredTimeScale */
  12739.     kSelectVDReleaseAsyncBuffers                                                 = 0x52,    /* VDReleaseAsyncBuffers */
  12740. };
  12741.  
  12742. Component Type and Subtype Values
  12743.  
  12744. Apple has defined a type value for video digitizer components. All video digitizer components have a component type value of 'vdig'. You can use the following constant to specify the component type value.
  12745. #define     videoDigitizerComponentType = 'vdig'
  12746. There are no special conventions applied to the subtype value of video digitizer components. 
  12747.  
  12748. Required Functions
  12749.  
  12750. Video digitizer components support a rich functional interface that can accommodate devices with quite varied capabilities. To relieve you from having to support irrelevant functions, Apple has made several video digitizer functions optional.
  12751. At a minimum, your video digitizer component must support the following functions:
  12752. VDGetActiveSrcRect    VDGetCurrentFlags    
  12753. VDGetDigitizerInfo    VDGetDigitizerRect    
  12754. VDGetFieldPreference    VDGetInput    
  12755. VDGetInputFormat    VDGetMaxSrcRect    
  12756. VDGetNumberOfInputs    VDGetPlayThruDestination    
  12757. VDGetVBlankRect    VDGetVideoDefaults    
  12758. VDGrabOneFrame    VDPreflightDestination    
  12759. VDSetDigitizerRect    VDSetFieldPreference    
  12760. VDSetInput    VDSetInputStandard    
  12761. VDSetPlayThruDestination        
  12762.  
  12763. All of these functions are required for all video digitizer components.
  12764.  
  12765.  
  12766. Optional Functions
  12767.  
  12768. Based on the type of device your component supports, you may have to implement functions other than those listed in “Required Functions,” and you may have to set some of your component’s capability flags. Read this section to learn which additional functions your component needs to support and how to set your capability flags properly.
  12769. If your component does not support a particular function, be sure to return a result code value of digiUnimpErr.
  12770. Note
  12771. Hardware support for the simultaneous capture and display of frames on the screen is called playthrough in these sections.u
  12772.  
  12773.  
  12774. Frame Grabbers Without Playthrough
  12775.  
  12776. Suppose your video digitization hardware grabs frames but cannot simultaneously display the frames on the screen. Suppose also that your hardware supplies the grabbed frames in QuickDraw pixel maps at specific pixel depths (say, 16 and 32 bits per pixel). For details on QuickDraw pixel maps, see the chapter “Basic QuickDraw” in Inside Macintosh: Imaging.
  12777. In this case, you should set the following component capability flags:
  12778. digiOutDoes16    Set this flag to 1.
  12779. digiOutDoes32    Set this flag to 1.
  12780.     Set other depth flags to 0.
  12781. digiOutDoesHWPlayThru
  12782. Set this flag to 0.
  12783. digiOutDoesDMA
  12784. Set this flag to 0.
  12785. If your component can operate asynchronously, you should also set the following flag:
  12786. digiOutDoesAsyncGrabs
  12787. Set this flag to 1 if your component can operate asynchronously.
  12788. Frame grabbers that support asynchronous operation must support the following optional functions:VDDone    VDGrabOneFrameAsync    
  12789. VDReleaseAsyncBuffers    VDSetupBuffers    
  12790.  
  12791.  
  12792. Frame Grabbers With Hardware Playthrough
  12793.  
  12794. If your frame grabber hardware provides support for playing the captured images directly, you need to support one additional function beyond those discussed in “Frame Grabbers Without Playthrough.” The VDSetPlayThruOnOff function (described on page 8-53) allows the application to turn playthrough on and off.
  12795. You should also set the digiOutDoesHWPlayThru capability flag (described on page 8-18) to 1. In addition, be sure to use the gdh field in the digitizer information structure to identify your component’s display device. For details on the video digitizer information structure, see page 8-20.
  12796.  
  12797. Key Color and Alpha Channel Devices
  12798.  
  12799. As a further elaboration on a basic frame grabber, your device could support the display or mixing of output data via an alpha channel or through the use of key colors (see “Types of Video Digitizer Components” on page 8-5 for more information about alpha channels and key colors). In either case, image data cannot be read directly from the screen. Therefore, you must set the digiOutDoesUnreadableScreenBits capability flag to 1. For more on the video digitizer capability flags, see “Capability Flags” beginning on page 8-14.
  12800. Your component must load its alpha channel or fill in the key color whenever playthrough is enabled or when the destination changes.
  12801.  
  12802. Compressed Source Devices
  12803.  
  12804. You may create a video digitizer component that supports a device that delivers compressed image data. In this case, your component is not capable of displaying the data directly.
  12805. Your component should set the following capability flags:
  12806. digiOutDoesCompress
  12807. Set this flag to 1.
  12808. digiOutDoesCompressOnly
  12809. Set this flag to 1 if your component cannot display the images directly.
  12810. digiOutDoesPlayThruDuringCompress
  12811. Set this flag to 1 if your component cannot display the images directly.
  12812. In addition, frame grabbers that support compressed source devices must support the following optional functions:VDCompressDone    VDCompressOneFrameAsync    
  12813. VDGetCompressionTypes    VDGetDataRate    
  12814. VDGetImageDescription    VDResetCompressSequence    
  12815. VDSetCompression    VDSetCompressionOnOff    
  12816. VDSetFrameRate    VDSetTimeBase    
  12817.  
  12818. If your hardware generates compressed data that cannot be decompressed by any standard QuickTime image decompressor components, be sure to provide an appropriate decompressor component so that the data you provide can be displayed.
  12819.  
  12820.  
  12821. Video Digitizer Components Reference
  12822.  
  12823. The following sections describe the constants, data structures, and functions that are specific to video digitizer components.
  12824.  
  12825. Constants
  12826.  
  12827. This section provides details on the video digitizer component’s capability and 
  12828. current flags.
  12829.  
  12830. Capability Flags
  12831.  
  12832. Video digitizer components report their capabilities to your application by means of capability flags. These flags are formatted as part of the digitizer information structure you obtain by calling the VDGetDigitizerInfo function, which is described on page 8-24. There are two sets of flags: one set describes the input capabilities of the video digitizer component; the other describes its output capabilities.
  12833. Video digitizer components support the following input capability flags:
  12834. digiInDoesNTSC
  12835. Indicates that the video digitizer supports National Television System Committee (NTSC) format input video signals. This flag is set to 1 if the digitizer component supports NTSC video.
  12836. digiInDoesPAL 
  12837. Indicates that the video digitizer component supports Phase Alternation Line (PAL) format input video signals. This flag is set to 1 if the digitizer component supports PAL video.
  12838. digiInDoesSECAM 
  12839. Indicates that the video digitizer component supports Systeme Electronique Couleur avec Memoire (SECAM) format input video signals. This flag is set to 1 if the digitizer component supports 
  12840. SECAM video.
  12841. digiInDoesGenLock
  12842. Indicates that the video digitizer component supports genlock; that is, the digitizer can derive its timing from an external time base. This flag is set to 1 if the digitizer component supports genlock.
  12843. digiInDoesComposite
  12844. Indicates that the video digitizer component supports composite input video. This flag is set to 1 if the digitizer component supports composite input.
  12845. digitInDoesSVideo
  12846. Indicates that the video digitizer component supports s-video input video. This flag is set to 1 if the digitizer component supports s-video input.
  12847. digiInDoesComponent
  12848. Indicates that the video digitizer component supports RGB input video. This flag is set to 1 if the digitizer component supports RGB input.
  12849. digiInVTR_Broadcast
  12850. Indicates that the video digitizer component can distinguish between an input signal that emanates from a videotape player and a broadcast signal. This flag is set to 1 if the digitizer component can differentiate between the two different signal types.
  12851. digiInDoesColor
  12852. Indicates that the video digitizer component supports color input. This flag is set to 1 if the digitizer component can accept color input.
  12853. digiInDoesBW 
  12854. Indicates that the video digitizer component supports grayscale input. This flag is set to 1 if the digitizer component can accept grayscale input.
  12855. Video digitizer components support the following output capability flags:
  12856. digiOutDoes1
  12857. Indicates that the video digitizer component can work with pixel maps that contain 1-bit pixels. If this flag is set to 1, then the digitizer component can write images that contain 1-bit pixels. If this flag is set 
  12858. to 0, then the digitizer component cannot handle such images.
  12859. digiOutDoes2
  12860. Indicates that the video digitizer component can work with pixel maps that contain 2-bit pixels. If this flag is set to 1, then the digitizer component can write images that contain 2-bit pixels. If this flag is set 
  12861. to 0, then the digitizer component cannot handle such images.
  12862. digiOutDoes4
  12863. Indicates that the video digitizer component can work with pixel maps that contain 4-bit pixels. If this flag is set to 1, then the digitizer component can write images that contain 4-bit pixels. If this flag is set 
  12864. to 0, then the digitizer component cannot handle such images.
  12865. digiOutDoes8
  12866. Indicates that the video digitizer component can work with pixel maps that contain 8-bit pixels. If this flag is set to 1, then the digitizer component can write images that contain 8-bit pixels. If this flag is set 
  12867. to 0, then the digitizer component cannot handle such images.
  12868. digiOutDoes16
  12869. Indicates that the video digitizer component can work with pixel maps that contain 16-bit pixels. If this flag is set to 1, then the digitizer component can write images that contain 16-bit pixels. If this flag is set 
  12870. to 0, then the digitizer component cannot handle such images.
  12871. digiOutDoes32
  12872. Indicates that the video digitizer component can work with pixel maps that contain 32-bit pixels. If this flag is set to 1, then the digitizer component can write images that contain 32-bit pixels. If this flag is set 
  12873. to 0, then the digitizer component cannot handle such images.
  12874. digiOutDoesDither
  12875. Indicates that the video digitizer component supports dithering. If this flag is set to 1, the component supports dithering of colors. If this flag is set to 0, the digitizer component does not support dithering.
  12876. digiOutDoesStretch
  12877. Indicates that the video digitizer component can stretch images to arbitrary sizes. If this flag is set to 1, the digitizer component can stretch images. If this flag is set to 0, the digitizer component does not support stretching.
  12878. digiOutDoesShrink
  12879. Indicates that the video digitizer component can shrink images to arbitrary sizes. If this flag is set to 1, the digitizer component can shrink images. If this flag is set to 0, the digitizer component does not support shrinking.
  12880. digiOutDoesMask
  12881. Indicates that the video digitizer component can handle clipping regions. If this flag is set to 1, the digitizer component can mask to an arbitrary clipping region. If this flag is set to 0, the digitizer component does not support clipping regions.
  12882. digiOutDoesDouble
  12883. Indicates that the video digitizer component supports stretching to quadruple size when displaying the output video. The parameters for the stretch operation are specified in the matrix structure for the request—the component modifies the scaling attributes of the matrix (see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for information about transformation matrices). If this flag is set to 1, the digitizer component can stretch an image to exactly four times its original size, up to the maximum size specified by the maxDestHeight and maxDestWidth fields in the digitizer information structure. If this flag is set to 0, the digitizer component does not support stretching to quadruple size. 
  12884. digiOutDoesQuad
  12885. Indicates that the video digitizer component supports stretching an image to 16 times its original size when displaying the output video. The parameters for the stretch operation are specified in the matrix structure for the request—the component modifies the scaling attributes of the matrix (see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for information about transformation matrices). If this flag is set to 1, the digitizer component can stretch an image to exactly 16 times its original size, up to the maximum size specified by the maxDestHeight and maxDestWidth fields in the digitizer information structure. If this flag is set to 0, the digitizer component does not support this capability. 
  12886. digiOutDoesQuarter
  12887. Indicates that the video digitizer component can shrink an image to one-quarter of its original size when displaying the output video. The parameters for the shrink operation are specified in the matrix structure for the request—the component modifies the scaling attributes of the matrix (see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for information about transformation matrices). If this flag is set to 1, the digitizer component can shrink an image to exactly one-quarter of its original size, down to the minimum size specified by the minDestHeight and minDestWidth fields in the digitizer information structure. If this flag is set to 0, the digitizer component does not support this capability. 
  12888. digiOutDoesSixteenth
  12889. Indicates that the video digitizer component can shrink an image to 1/16 of its original size when displaying the output video. The parameters for the shrink operation are specified in the matrix structure for the request—the digitizer component modifies the scaling attributes of the matrix (see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime for information about transformation matrices). If this flag is set to 1, the digitizer component can shrink an image to exactly 1/16 of its original size, down to the minimum size specified by the minDestHeight and minDestWidth fields in the digitizer information structure. If this flag is set to 0, the digitizer component does not support this capability. 
  12890. digiOutDoesRotate
  12891. Indicates that the video digitizer component can rotate an image when displaying the output video. The parameters for the rotation are specified in the matrix structure for an operation. If this flag is set to 1, the 
  12892. digitizer component can rotate the image. If this flag is set to 0, 
  12893. the digitizer component cannot rotate the resulting image. 
  12894. digiOutDoesHorizFlip
  12895. Indicates that the video digitizer component can flip an image horizontally when displaying the output video. The parameters for 
  12896. the horizontal flip are specified in the matrix structure for an operation. If this flag is set to 1, the digitizer component can flip the image. If this flag is set to 0, the digitizer component cannot flip the resulting image. 
  12897. digiOutDoesVertFlip
  12898. Indicates that the video digitizer component can flip an image vertically when displaying the output video. The parameters for the vertical flip are specified in the matrix structure for an operation. If this flag is set to 1, the digitizer component can flip the image. If this flag is set to 0, the digitizer component cannot flip the resulting image. 
  12899. digiOutDoesSkew
  12900. Indicates that the video digitizer component can skew an image when displaying the output video. Skewing an image distorts it linearly along only a single axis—for example, drawing a rectangular image into a parallelogram-shaped region. The parameters for the skew operation are specified in the matrix structure for the request. If this flag is set to 1, the digitizer component can skew an image. If this flag is set to 0, the digitizer component does not support this capability. 
  12901. digiOutDoesBlend
  12902. Indicates that the video digitizer component can blend the resulting image with a matte when displaying the output video. The matte is provided by the application by defining either an alpha channel or a mask plane. If this flag is set to 1, the digitizer component can blend. If this flag is set to 0, the digitizer component does not support this capability. 
  12903. digiOutDoesWarp
  12904. Indicates that the video digitizer component can warp an image when displaying the output video. Warping an image distorts it along one or more axes, perhaps nonlinearly, in effect “bending” the result region. The parameters for the warp operation are specified in the matrix structure for the request. If this flag is set to 1, the digitizer component can warp an image. If this flag is set to 0, the digitizer component does not support this capability. 
  12905. digiOutDoesDMA
  12906. Indicates that the video digitizer component can write to any screen or to offscreen memory. If this flag is set to 1, the digitizer component can use DMA to write to any screen or memory location.
  12907. digiOutDoesHWPlayThru
  12908. Indicates that the video digitizer component does not need idle time in order to display its video. If this flag is set to 1, your application does not need to grant processor time to the digitizer component at normal display speeds.
  12909. digiOutDoesILUT
  12910. Indicates that the video digitizer component supports inverse lookup tables for indexed color modes. If this flag is set to 1, the digitizer component uses inverse lookup tables when appropriate.
  12911. digiOutDoesKeyColor
  12912. Indicates that the video digitizer component supports clipping by means of key colors. If this flag is set to 1, the digitizer component can clip to a region defined by a key color.
  12913. digiOutDoesAsyncGrabs
  12914. Indicates that the video digitizer component can operate asynchronously. If this flag is set to 1, your application can use the VDSetupBuffers and VDGrabOneFrameAsync functions (described on page 8-54 and page 8-56, respectively).
  12915. digiOutDoesUnreadableScreenBits
  12916. Indicates that the video digitizer may place pixels on the screen that cannot be used when compressing images.
  12917. digiOutDoesCompress
  12918. Indicates that the video digitizer component supports compressed source devices. These devices provide compressed data directly, without having to use the Image Compression Manager. See “Controlling Compressed Source Devices” beginning on page 8-42 for more information about the functions that applications can use to work with compressed source devices.
  12919. digiOutDoesCompressOnly
  12920. Indicates that the video digitizer component only provides compressed image data; the component cannot provide displayable data. This flag only applies to digitizers that support compressed source devices.
  12921. digiOutDoesPlayThruDuringCompress
  12922. Indicates that the video digitizer component can draw images on the screen at the same time that it is delivering compressed image data. This flag only applies to digitizers that support compressed source devices.
  12923.  
  12924. Current Flags
  12925.  
  12926. Video digitizer components report their current status to your application by means of flags. These flags are formatted as part of the digitizer information structure that you obtain by calling the VDGetDigitizerInfo function (described on page 8-24). Alternatively, you can obtain these flags by calling the VDGetCurrentFlags function (described on page 8-25). There are two sets of flags: one set describes the status of the digitizer with respect to its input signal; the other describes its status with respect to its output.
  12927. Video digitizer components report their current status by returning a flags field that contains 1 bit for each of the capability flags (discussed in “Capability Flags” beginning on page 8-14) plus additional flags as appropriate. The digitizer component sets these flags to reflect its current status. When reporting input status, for example, a video digitizer component sets the digiInDoesGenLock flag to 1 whenever the digitizer component is deriving its time signal from the input video. When reporting its input capabilities, the digitizer component sets this flag to 1 to indicate that it can derive its timing from the input video.
  12928. Video digitizer components report their current input status by returning a flags field that contains a bit for each of the input capability flags (discussed in “Capability Flags” beginning on page 8-14) plus one additional flag. 
  12929. The additional flag is as follows:
  12930. digiInSignalLock
  12931. Indicates that the video digitizer component is locked onto the input signal. If this flag is set to 1, the digitizer component detects either vertical or horizontal signal lock.
  12932. Video digitizer components report their current output status by returning a flags field that contains a bit for each of the output capability flags discussed in “Capability Flags” beginning on page 8-14. The digitizer component sets these flags to reflect its current output status. 
  12933.  
  12934.  
  12935. Data Types
  12936.  
  12937. This section discusses the data structures that are used by video digitizer components and by applications that use video digitizer components.
  12938.  
  12939. The Digitizer Information Structure
  12940.  
  12941. Your application can retrieve information about the capabilities and current status of a video digitizer component. You call the VDGetDigitizerInfo function, described on page 8-24, to retrieve all this information from a video digitizer component. In response, the component formats a digitizer information structure. The contents of this structure fully define the capabilities and current status of the video digitizer component.
  12942. Note
  12943. If you are interested only in the current status information, you can call the VDGetCurrentFlags function, which is described on page 8-25. This function returns the input and output current flags of the video digitizer component.u
  12944.  
  12945. The DigitizerInfo data type defines the layout of the digitizer information structure.
  12946. struct DigitizerInfo {
  12947.     short            vdigType;                                /* type of digitizer component */
  12948.     long             inputCapabilityFlags;                                /* input video signal features */
  12949.     long             outputCapabilityFlags;                                /* output digitized video data
  12950.                                                     features of digitizer component */
  12951.     long            inputCurrentFlags;                                /* status of input video signal */
  12952.     long             outputCurrentFlags;                                /* status of output digitized 
  12953.                                                     video information */
  12954.     short             slot;                                /* for connection purposes */
  12955.     GDHandle             gdh;                                /* for digitizers with preferred 
  12956.                                                     screen */
  12957.     GDHandle            maskgdh;                                /* for digitizers with mask planes */
  12958.     short             minDestHeight;                                /* smallest resizable height */
  12959.     short             minDestWidth;                                /* smallest resizable width */
  12960.     short             maxDestHeight;                                /* largest resizable height */
  12961.     short             maxDestWidth;                                /* largest resizable width */
  12962.     short             blendLevels;                                /* number of blend levels supported 
  12963.                                                     (2 if 1-bit mask) */
  12964.     long            private;                                    /* reserved--set to 0 */
  12965. };
  12966. typedef struct DigitizerInfo DigitizerInfo;
  12967. Field descriptions
  12968. vdigType    Specifies the type of video digitizer component. Valid values are
  12969. vdTypeBasic
  12970. Basic video digitizer—does not support any clipping
  12971. vdTypeAlpha
  12972. Supports clipping by means of an alpha channel
  12973. vdTypeMask
  12974. Supports clipping by means of a mask plane
  12975. vdTypeKey    
  12976. Supports clipping by means of key colors
  12977. inputCapabilityFlags
  12978. Specifies the capabilities of the video digitizer component with respect to the input video signal. These flags are discussed in “Capability Flags” beginning on page 8-14.
  12979. outputCapabilityFlags
  12980. Specifies the capabilities of the video digitizer component with respect to the output digitized video information. These flags are discussed in “Capability Flags” beginning on page 8-14.
  12981. inputCurrentFlags
  12982. Specifies the current status of the video digitizer with respect to the input video signal. These flags are discussed in “Current Flags” on page 8-19.
  12983. outputCurrentFlags
  12984. Specifies the current status of the video digitizer with respect to the output digitized video information. These flags are discussed in “Current Flags” on page 8-19.
  12985. slot    Identifies the slot that contains the video digitizer interface card.
  12986. gdh    Contains a handle to the graphics device that defines the screen to which the digitized data is to be written. Set this field to nil if your application is not constrained to a particular graphics device. 
  12987. maskgdh    Contains a handle to the graphics device that contains the mask plane. This field is used only by digitizers that clip by means of mask planes.
  12988. minDestHeight
  12989. Indicates the smallest height value the digitizer component can accommodate in its destination.
  12990. minDestWidth
  12991. Indicates the smallest width value the digitizer component can accommodate in its destination.
  12992. maxDestHeight
  12993. Indicates the largest height value the digitizer component can accommodate in its destination.
  12994. maxDestWidth
  12995. Indicates the largest width value the digitizer component can accommodate in its destination.
  12996. blendLevels
  12997. Specifies the number of blend levels the video digitizer component supports.
  12998. private    Reserved. Set this field to 0.
  12999.  
  13000. The Buffer List Structure
  13001.  
  13002. If you are using more than one asynchronous output buffer, you must define the output buffers to the video digitizer component. You define these output buffers by calling the VDSetupBuffers function (described on page 8-54). You specify the buffers to that function in a buffer list structure. Note that all the output buffers must be the same size and must accommodate output rectangles of the same dimensions. 
  13003. The VdigBufferRecList data type defines a buffer list structure.
  13004. struct VdigBufferRecList {
  13005.     short                        count;            /* number of buffers defined by 
  13006.                                             this structure */
  13007.     MatrixRecordPtr                        matrix;            /* tranformation matrix applied to 
  13008.                                             destination rectangles before
  13009.                                             video image is displayed */
  13010.     RgnHandle                        mask;            /* clipping region applied to
  13011.                                             destination rectangle before
  13012.                                             video image is displayed */
  13013.     VdigBufferRec                        list[1];            /* array of output buffer
  13014.                                             specifications */
  13015. };
  13016. Field descriptions
  13017. count    Specifies the number of buffers defined by this structure. The value of this field must correspond to the number of entries in the list array.
  13018.  
  13019. matrix    Specifies the transformation matrix that is applied to all of the destination rectangles before the video image is displayed. You must specify a matrix. If you do not want to perform any transformations, use the identity matrix.
  13020. mask    Specifies a clipping region that is applied to the destination rectangle before the video image is displayed. Note that this region applies to only the first destination buffer. If you want the region 
  13021. to apply to all of your destination buffers, you must do this yourself. For example, you can use QuickDraw’s OffsetRgn function, which is described in the chapter “Basic QuickDraw” in Inside Macintosh: Imaging. If you do not want to specify a clipping region, set this field to nil.
  13022. list    Contains an array of output buffer specifications. Each buffer is represented by a buffer structure. The format and content of this structure are described in the next section. 
  13023.  
  13024.  
  13025. The Buffer Structure
  13026.  
  13027. The VdigBufferRec data type defines a buffer structure.
  13028. typedef struct {
  13029.     PixMapHandle                    dest;                /* handle to pixel map for
  13030.                                             destination buffer */
  13031.     Point                    location;                /* location of video destination
  13032.                                             in pixel map */
  13033.     long                    reserved;                /* reserved--set to 0 */
  13034. } VdigBufferRec;
  13035. Field descriptions
  13036. dest    Contains a handle to the pixel map that defines the destination buffer.
  13037.  
  13038. location    Specifies the location of the video destination in the pixel 
  13039. map specified by the dest field. This point identifies the upper-left corner of the destination rectangle. The size and scaling of the destination rectangle are governed by the matrix and mask fields of the buffer list structure that contains this structure.
  13040. reserved    Reserved for use by Apple. Set this field to 0.
  13041.  
  13042. Video Digitizer Component Functions
  13043.  
  13044. This section describes the functions that are provided by video digitizer components. These functions are described from the perspective of an application that uses video digitizer components. If you are developing a video digitizer component, your digitizer component must behave as described here.
  13045. This section has been divided into the following topics:
  13046. n    “Getting Information About Video Digitizer Components” describes the functions that allow applications to obtain information about the capabilities of video digitizer components.
  13047. n    “Setting Source Characteristics” discusses the video digitizer functions that allow applications to establish the source video environment.
  13048. n    “Selecting an Input Source” describes how applications select the input video source.
  13049. n    “Setting Video Destinations” describes the functions that allow applications to establish the destination display environment.
  13050. n    “Controlling Compressed Source Devices” describes the functions that allow applications to work with devices that return compressed image data.
  13051. n    “Controlling Digitization” describes functions that allow applications to start and stop digitization.
  13052. n    “Controlling Color” discusses the functions that allow applications to control color mapping in the video digitizer component.
  13053. n    “Controlling Analog Video” describes several functions that allow applications to control the characteristics of the input analog video signal.
  13054. n    “Selectively Displaying Video” discusses functions that allow applications to work with the key colors that are used to control video display.
  13055. n    “Clipping” discusses functions that allow applications to control the clipping region used by video digitizer components.
  13056. n    “Utility Functions” describes a few utility functions that are supported by video digitizer components.
  13057. Note
  13058. If you are developing an application that uses video digitizer components, you should read the sections that are appropriate to your application. If you are developing a video digitizer component, you should read all the sections.u
  13059.  
  13060. These functions specify the video digitizer components for their requests with a reference obtained from the Component Manager’s OpenComponent function. See the chapter “Component Manager” in Inside Macintosh: More Macintosh Toolbox for details.
  13061.  
  13062. Getting Information About Video Digitizer Components
  13063.  
  13064. This section discusses functions that allow applications to obtain information about the capabilities and current state of video digitizer components. 
  13065. You can use the VDGetDigitizerInfo function in your application to retrieve information about the capabilities of a video digitizer component. You can use the VDGetCurrentFlags function to obtain current status information from a video digitizer component.
  13066.  
  13067. VDGetDigitizerInfo
  13068.  
  13069. The VDGetDigitizerInfo function returns capability and status information about a specified video digitizer component. 
  13070. All video digitizer components must support this function.
  13071. pascal VideoDigitizerError VDGetDigitizerInfo
  13072.                                              (VideoDigitizerComponent ci,
  13073.                                                 DigitizerInfo *info);
  13074. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13075. info    Contains a pointer to a digitizer information structure. The VDGetDigitizerInfo function returns information describing the capabilities of the specified video digitizer into this structure. See “The Digitizer Information Structure” on page 8-20 for a complete description.
  13076. DESCRIPTION
  13077. The VDGetDigitizerInfo function returns the capability and status information in a digitizer information structure (defined by the DigitizerInfo data type).
  13078. RESULT CODEnoErr    0    No error    
  13079.  
  13080. SEE ALSO
  13081. Your application may also use the VDGetCurrentFlags function (described in the next section) to retrieve just the current status information about a video digitizer component.
  13082.  
  13083. VDGetCurrentFlags
  13084.  
  13085. The VDGetCurrentFlags function returns status information about a specified video digitizer component.
  13086. All video digitizer components must support this function.
  13087. pascal VideoDigitizerError VDGetCurrentFlags 
  13088.                                                 (VideoDigitizerComponent ci,
  13089.                                                  long *inputCurrentFlag,             
  13090.                                                  long *outputCurrentFlag);
  13091. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13092. inputCurrentFlag
  13093. Contains a pointer to a long integer that is to receive the current input state flags for the video digitizer component. The VDGetCurrentFlags function returns the current input state flags into this location. See “Current Flags” on page 8-19 for a complete description of these flags.
  13094. outputCurrentFlag
  13095. Contains a pointer to a long integer that is to receive the current output state flags for the video digitizer component. The VDGetCurrentFlags function returns the current output state flags into this location. See “Current Flags” on page 8-19 for a complete description of these flags.
  13096. DESCRIPTION
  13097. The VDGetCurrentFlags function returns the status information into two fields that contain flags specifying the current input and output status of the digitizer component. 
  13098. You can also use the VDGetDigitizerInfo function (described in the previous section) in your application to retrieve capability and current status information about a video digitizer component. 
  13099. The VDGetCurrentFlags function is often more convenient than the VDGetDigitizerInfo function. For example, this function provides a simple mechanism for determining whether a video digitizer is receiving a valid input signal. An application can retrieve the current input state flags and test the high-order bit by examining the sign of the returned value. If the value is negative (that is, the high-order bit, digiInSignalLock, is set to 1), the digitizer component is receiving a valid input signal.
  13100. RESULT CODEnoErr    0    No error    
  13101.  
  13102.  
  13103. Setting Source Characteristics
  13104.  
  13105. This section discusses the video digitizer component functions that allow applications to set the spatial characteristics of the source video signal. You can use these functions in your application to set and retrieve information about the maximum source rectangle, the active source rectangle, the vertical blanking rectangle, and the digitizer rectangle. For a complete discussion of the relationship between these rectangles, see “About Video Digitizer Components,” which begins on page 8-3.
  13106. You can use the VDGetMaxSrcRect function in your application to get the size and location of the maximum source rectangle. Similarly, the VDGetActiveSrcRect function allows you to get this information about the active source rectangle, and the VDGetVBlankRect function enables you to obtain information about the vertical blanking rectangle.
  13107. You can use the VDSetDigitizerRect function to set the size and location of the digitizer rectangle. The VDGetDigitizerRect function lets you retrieve the size and location of this rectangle.
  13108.  
  13109. VDGetMaxSrcRect
  13110.  
  13111. The VDGetMaxSrcRect function returns the maximum source rectangle.
  13112. pascal VideoDigitizerError VDGetMaxSrcRect
  13113.                                              (VideoDigitizerComponent ci,
  13114.                                                 short inputStd, 
  13115.                                                 Rect *maxSrcRect);
  13116. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13117. inputStd    A short integer that specifies the input video signal associated with this maximum source rectangle.
  13118. maxSrcRect
  13119. Contains a pointer to a rectangle that is to receive the size and location information for the maximum source rectangle.
  13120. DESCRIPTION
  13121. The maximum source rectangle defines the spatial boundaries of the input video signal. All other rectangles—active source rectangle, digitizer rectangle, and vertical blanking rectangle—are defined relative to the maximum source rectangle. For a complete discussion of the relationship between these rectangles, see “About Video Digitizer Components,” which begins on page 8-3.
  13122. All video digitizer components must support this function.
  13123. RESULT CODESnoErr    0    No error    
  13124. qtParamErr    –2202    Invalid parameter value    
  13125.  
  13126.  
  13127. VDGetActiveSrcRect
  13128.  
  13129. The VDGetActiveSrcRect function allows applications to obtain the size and location information for the active source rectangle used by a video digitizer component. 
  13130. pascal VideoDigitizerError VDGetActiveSrcRect
  13131.                                              (VideoDigitizerComponent ci,
  13132.                                                 short inputStd,
  13133.                                                 Rect *activeSrcRect);
  13134. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13135. inputStd    A short integer that specifies the input video signal associated with this maximum source rectangle.
  13136. activeSrcRect
  13137. Contains a pointer to a rectangle that is to receive the size and location information for the active source rectangle.
  13138. DESCRIPTION
  13139. The source rectangle is that area in the source video image that contains active 
  13140. video. The video digitizer component returns spatial information that is relative to the maximum source rectangle. For a complete discussion of the relationship between these rectangles, see “About Video Digitizer Components,” which begins on page 8-3.
  13141. All video digitizer components must support this function.
  13142. RESULT CODESnoErr    0    No error    
  13143. qtParamErr    –2202    Invalid parameter value    
  13144.  
  13145.  
  13146. VDGetVBlankRect
  13147.  
  13148. The VDGetVBlankRect function returns the vertical blanking rectangle.
  13149. pascal VideoDigitizerError VDGetVBlankRect
  13150.                                              (VideoDigitizerComponent ci,
  13151.                                                 short inputStd, 
  13152.                                                 Rect *vBlankRect);
  13153. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13154. inputStd    Specifies a short integer for the signaling standard used in the source video signal. Valid values are
  13155. ntscIn    Input video signal to digitize is in NTSC format
  13156. palIn    Input video signal to digitize is in PAL format
  13157. secamIn    Input video signal to digitize is in SECAM format
  13158. vBlankRect
  13159. Contains a pointer to a rectangle that is to receive the size and location information for the vertical blanking rectangle.
  13160. DESCRIPTION
  13161. The vertical blanking rectangle defines the vertical blanking area in the input video signal, and it corresponds to lines 10 through 19 of the incoming video signal. The video digitizer component returns spatial information that is relative to the maximum source rectangle. For a complete discussion of the relationship between these rectangles, see “About Video Digitizer Components,” which begins on page 8-3.
  13162. All video digitizer components must support this function.
  13163. RESULT CODESnoErr    0    No error    
  13164. qtParamErr    –2202    Invalid parameter value    
  13165.  
  13166.  
  13167. VDSetDigitizerRect
  13168.  
  13169. The VDSetDigitizerRect function allows applications to set the current digitizer rectangle.
  13170. pascal VideoDigitizerError VDSetDigitizerRect
  13171.                                              (VideoDigitizerComponent ci,
  13172.                                                  Rect *digitizerRect);
  13173. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13174. digitizerRect
  13175. Contains a pointer to a rectangle that contains the size and location information for the digitizer rectangle. The coordinates of this rectangle must be relative to the maximum source rectangle. In addition, the digitizer rectangle must be within the maximum source rectangle.
  13176. DESCRIPTION
  13177. The current digitizer rectangle defines the area that the digitizer component reads from the input video signal. Applications can crop the input video signal by manipulating this rectangle. The digitizer rectangle coordinates must be specified relative to the maximum source rectangle. Furthermore, the digitizer rectangle must be completely within the maximum source rectangle. For a complete discussion of the relationship between these rectangles, see “About Video Digitizer Components,” which begins on page 8-3.
  13178. All video digitizer components must support this function.
  13179. RESULT CODESnoErr    0    No error    
  13180. qtParamErr    –2202    Invalid parameter value    
  13181.  
  13182.  
  13183.  
  13184. VDGetDigitizerRect
  13185.  
  13186. The VDGetDigitizerRect function returns the current digitizer rectangle.
  13187. pascal VideoDigitizerError VDGetDigitizerRect
  13188.                                              (VideoDigitizerComponent ci,
  13189.                                                  Rect *digitizerRect);
  13190. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13191. digitizerRect
  13192. Contains a pointer to a rectangle that is to receive the size and location information for the current digitizer rectangle.
  13193. DESCRIPTION
  13194. The current digitizer rectangle defines the area that the digitizer component reads from the input video signal. The video digitizer component returns spatial information that is relative to the maximum source rectangle. For a complete discussion of the relationship between these rectangles, see “About Video Digitizer Components,” which begins on page 8-3. 
  13195. All video digitizer components must support this function.
  13196. RESULT CODEnoErr    0    No error    
  13197.  
  13198.  
  13199. Selecting an Input Source
  13200.  
  13201. This section discusses the video digitizer component functions that allow applications to select an input video source. 
  13202. Some of these functions provide information about the available video inputs. Applications can use the VDGetNumberOfInputs function to determine the number of video inputs supported by the digitizer component. The VDGetInputFormat function allows applications to find out the video format (composite, s-video, or component) employed by a specified input. 
  13203. You can use the VDSetInput function in your application to specify the input to be used by the digitizer component. The VDGetInput function returns the currently selected input.
  13204. The VDSetInputStandard function allows you to specify the video signaling standard to be used by the video digitizer component.
  13205.  
  13206.  
  13207. VDGetNumberOfInputs
  13208.  
  13209. The VDGetNumberOfInputs function returns the number of input video sources that a video digitizer component supports. 
  13210. All video digitizer components must support this function.
  13211. pascal VideoDigitizerError VDGetNumberOfInputs
  13212.                                              (VideoDigitizerComponent ci,
  13213.                                                  short *inputs);
  13214. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13215. inputs    Contains a pointer to an integer that is to receive the number of input video sources supported by the specified component. Video digitizer components number video sources sequentially, starting at 0. So, if a digitizer component supports two inputs, this function sets the field referred to by the inputs parameter to 1.
  13216. RESULT CODEnoErr    0    No error    
  13217.  
  13218.  
  13219. VDSetInput
  13220.  
  13221. The VDSetInput function allows applications to select the input video source for a video digitizer component.
  13222. All video digitizer components must support this function.
  13223. pascal VideoDigitizerError VDSetInput (VideoDigitizerComponent ci,
  13224.                                                      short input);
  13225. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13226. input    Specifies the input video source for this request. Video digitizer components number video sources sequentially, starting at 0. So, to request the first video source, an application sets this parameter to 0. 
  13227. RESULT CODESnoErr    0    No error    
  13228. qtParamErr    –2202    Invalid parameter value    
  13229.  
  13230. SEE ALSO
  13231. Applications can get the number of video sources supported by a video digitizer component by calling the VDGetNumberOfInputs function (described in the previous section). Applications can get more information about a video source by calling the VDGetInputFormat function (described on page 8-32).
  13232.  
  13233. VDGetInput
  13234.  
  13235. The VDGetInput function returns data that identifies the currently active input video source.
  13236. All video digitizer components must support this function.
  13237. pascal VideoDigitizerError VDGetInput (VideoDigitizerComponent ci,
  13238.                                                      short *input);
  13239. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13240. input    Contains a pointer to a short integer that is to receive the identifier for the currently active input video source. Video digitizer components number video sources sequentially, starting at 0. So, if the first source is active, this function sets the field referred to by the input parameter to 0.
  13241. RESULT CODESnoErr    0    No error    
  13242. qtParamErr    –2202    Invalid parameter value    
  13243.  
  13244.  
  13245. VDGetInputFormat
  13246.  
  13247. The VDGetInputFormat function allows applications to determine the format of the video signal provided by a specified video input source.
  13248. pascal VideoDigitizerError VDGetInputFormat 
  13249.                                             (VideoDigitizerComponent ci,
  13250.                                              short input, short *format);
  13251. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13252. input    Specifies the input video source for this request. Video digitizer components number video sources sequentially, starting at 0. So, to request information about the first video source, an application sets this parameter to 0. Applications can get the number of video sources supported by a video digitizer component by calling the VDGetNumberOfInputs function, discussed on page 8-31.
  13253. format    Contains a pointer to a short integer that is to receive the specification of the video format of the specified input source. This function updates the field referred to by the format parameter. Valid values are
  13254. compositeIn
  13255. The input video signal is in composite format
  13256. sVideoIn    The input video signal is in s-video format
  13257. rgbComponentIn
  13258. The input video signal is in RGB component format
  13259. DESCRIPTION
  13260. Video digitizer components support three video formats: composite video, s-video, and component video (RGB signal).
  13261. All video digitizer components must support this function.
  13262. RESULT CODESnoErr    0    No error    
  13263. qtParamErr    –2202    Invalid parameter value    
  13264.  
  13265.  
  13266. VDSetInputStandard
  13267.  
  13268. The VDSetInputStandard function allows applications to specify the input 
  13269. signaling standard to digitize. Video digitizer components support three input signaling standards: NTSC, PAL, and SECAM. 
  13270. pascal VideoDigitizerError VDSetInputStandard
  13271.                                              (VideoDigitizerComponent ci,
  13272.                                                  short inputStandard);
  13273. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13274. inputStandard
  13275. A short integer that specifies the signaling standard used in the source video signal. Valid values are
  13276. ntscIn    Input video signal to digitize is in NTSC format
  13277. palIn    Input video signal to digitize is in PAL format
  13278. secamIn    Input video signal to digitize is in SECAM format
  13279. DESCRIPTION
  13280. Applications can use the VDGetDigitizerInfo function (described on page 8-24) to determine the capabilities of a specified video digitizer component. Applications can use the VDGetCurrentFlags function (described on page 8-25) to determine the current input state of a digitizer component.
  13281. All video digitizer components must support this function.
  13282. SPECIAL CONSIDERATIONS
  13283. Your digitizer component should ensure that spatial characteristics that were set for one standard are not interpreted within another standard. 
  13284. RESULT CODESnoErr    0    No error    
  13285. qtParamErr    –2202    Invalid parameter value    
  13286.  
  13287.  
  13288. Setting Video Destinations
  13289.  
  13290. Video digitizer components provide several functions that allow applications to specify the destination for the digitized video stream produced by the digitizer component. Applications have two options for specifying the destination for the video data stream. 
  13291. The first option requires that the video be digitized as RGB pixels and placed into a destination pixel map. This option allows the video to be placed either onscreen or offscreen, depending upon the placement of the pixel map. You can use the VDSetPlayThruDestination function in your application to set the characteristics for this option. The VDPreflightDestination function lets you determine the capabilities of the digitizer in your application. All video digitizer components must support this option. The VDGetPlayThruDestination function lets you get data about the current video destination.
  13292. The second option uses a global boundary rectangle to define the destination for the video. This option is useful only with digitizers that support hardware DMA. You can use the VDSetPlayThruGlobalRect function in your application to set the characteristics for this option. You can use the VDPreflightGlobalRect function in your application to determine the capabilities of the digitizer. Not all video digitizer components support this option. 
  13293. The VDGetMaxAuxBuffer function returns information about a buffer that may be located on some special hardware. 
  13294.  
  13295. VDSetPlayThruDestination
  13296.  
  13297. You can use the VDSetPlayThruDestination function in your application to establish the destination settings for a video digitizer component. 
  13298. All video digitizer components must support this function.
  13299. pascal VideoDigitizerError VDSetPlayThruDestination
  13300.                                          (VideoDigitizerComponent ci,
  13301.                                             PixMapHandle dest, 
  13302.                                             Rect *destRect, 
  13303.                                             MatrixRecord *m, RgnHandle mask);
  13304. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13305. dest    Contains a handle to the destination pixel map. This pixel map may be in the video frame buffer of the Macintosh computer, or it may specify an offscreen buffer.
  13306.     The video digitizer component examines this pixel map to determine the display characteristics of the video destination, including the base address, row bytes, and pixel depth. If the digitizer component does not support these characteristics, it sets the return value to badDepth. If the digitizer component cannot accommodate the location of the destination pixel map, it sets the return value to noDMA. 
  13307.     If you are going to use multiple output buffers, be sure to include this buffer in the buffer list that you define with the VDSetupBuffers function, which is described on page 8-54. You may call 
  13308. the VDSetupBuffers function before calling VDSetPlayThruDestination.
  13309. destRect    Contains a pointer to a rectangle that specifies the size and location of the video destination. This rectangle must be in the coordinate system of the destination pixel map specified by the dest parameter. 
  13310.     This is an optional parameter. Applications may specify a transformation matrix to control the placement and scaling of the video image in the destination pixel map. In this case, the destRect parameter is set to nil and the m parameter specifies the matrix.
  13311.     If the destRect parameter is nil, you can determine the destination rectangle for simple matrices by calling the TransformRect function using the current digitizer rectangle and this matrix. For more information on TransformRect, see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime.
  13312. m    Contains a pointer to a matrix structure containing the transformation matrix for the destination video image. To determine the capabilities of a video digitizer component, you can call the VDGetDigitizerInfo function, described on page 8-24, in your application.
  13313.     This is an optional parameter. Applications may specify a destination rectangle to control the placement and scaling of the video image in the destination pixel map. In this case, the m parameter is set to nil and the destRect parameter specifies the destination rectangle.
  13314. mask    Contains a region handle that defines a mask. Applications can use masks to control clipping of the video into the destination rectangle. This mask region is defined in the destination coordinate space.
  13315.     This is an optional parameter. Applications may use alpha channels or key colors to control video blending. If there is no mask, applications should set the mask parameter to nil.
  13316. DESCRIPTION
  13317. The application provides the desired settings as parameters to this function. Applications should verify that the video digitizer component can accommodate the settings by calling the VDPreflightDestination function, described in the next section.
  13318. Applications set the source digitizer rectangle by calling the VDSetDigitizerRect function, described on page 8-29.
  13319. RESULT CODESnoErr    0    No error    
  13320. badDepth    –2207    Digitizer cannot accommodate pixel depth    
  13321. noDMA    –2208    Digitizer cannot use DMA to this destination    
  13322.  
  13323.  
  13324. VDPreflightDestination
  13325.  
  13326. You can use the VDPreflightDestination function in your application to verify that a video digitizer component can support a set of destination settings intended for use with the VDSetPlayThruDestination function, which is described in the previous section. 
  13327. pascal VideoDigitizerError VDPreflightDestination
  13328.                                             (VideoDigitizerComponent ci,
  13329.                                              Rect *digitizerRect,
  13330.                                              PixMapHandle dest, 
  13331.                                              Rect *destRect, 
  13332.                                              MatrixRecord *m);
  13333. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13334. digitizerRect
  13335. Contains a pointer to a rectangle that contains the size and location information for the digitizer rectangle. The coordinates of this rectangle must be relative to the maximum source rectangle. In addition, the digitizer rectangle must be within the maximum source rectangle. For a complete discussion of the relationship between these rectangles, see “About Video Digitizer Components,” which begins on page 8-3.
  13336.     If the video digitizer component cannot accommodate the specified rectangle, it changes the coordinates in this structure to specify a rectangle that it can support and sets the result to qtParamErr.
  13337. dest    Contains a handle to the destination pixel map. 
  13338. destRect    Contains a pointer to a rectangle that specifies the size and location of the video destination. This rectangle must be in the coordinate system of the destination pixel map specified by the dest parameter. If the video digitizer component cannot accommodate this rectangle, it changes the coordinates in the structure to specify a rectangle that it can support and sets the result to qtParamErr.
  13339.     This is an optional parameter. Applications may specify a transformation matrix to control the placement and scaling of the video image in the destination pixel map. In this case, the destRect parameter is set to nil and the m parameter specifies the matrix.
  13340. m    Contains a pointer to a matrix structure containing the transformation matrix for the destination video image. If the video digitizer component cannot accommodate this matrix, it changes the values in the structure to define a matrix that it can support and sets the result to qtParamErr. Applications can determine the capabilities of a video digitizer component by calling the VDGetDigitizerInfo function, described on page 8-24.
  13341.     This is an optional parameter. Applications may specify a destination rectangle to control the placement and scaling of the video image in the destination pixel map. In this case, the m parameter is set to nil and the destRect parameter specifies the destination rectangle.
  13342.     If the destRect parameter is nil, you can determine the destination rectangle for simple matrices by calling the TransformRect function using the current digitizer rectangle and this matrix. For more information on TransformRect, see the chapter “Movie Toolbox” in Inside Macintosh: QuickTime.
  13343. DESCRIPTION
  13344. The application provides the desired settings as parameters to this function. The video digitizer component then examines those settings. If the digitizer component can support the specified settings, it sets the result code to noErr. If the digitizer component cannot support the settings, it alters the input settings to reflect values that it can support and returns a result code of qtParamErr. The application can then use the settings with the VDSetPlayThruDestination function (described in the previous section).
  13345. All video digitizer components must support this function.
  13346. Applications should use the VDPreflightDestination function to test destination settings whenever the video digitizer component cannot support arbitrary scaling. 
  13347. RESULT CODESnoErr    0    No error    
  13348. qtParamErr    –2202    Invalid parameter value    
  13349.  
  13350. SEE ALSO
  13351. Applications can determine the capabilities of a video digitizer component by examining the output capability flags (see the discussion of the VDGetCurrentFlags function, which begins on page 8-25, for more information about retrieving these flags). Specifically, if the digiOutDoesStretch and digiOutDoesShrink flags are set to 1 in the output capability flag, the digitizer component supports arbitrary scaling. 
  13352.  
  13353. VDGetPlayThruDestination
  13354.  
  13355. The VDGetPlayThruDestination function allows applications to obtain information about the current video destination. 
  13356. All video digitizer components must support this function.
  13357. pascal VideoDigitizerError VDGetPlayThruDestination
  13358.                                      (VideoDigitizerComponent ci,
  13359.                                         PixMapHandle *dest, Rect *destRect,
  13360.                                         MatrixRecord *m, RgnHandle *mask);
  13361. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13362. dest    Contains a pointer to a pixel map handle. The video digitizer component returns a handle to the destination pixel map in the field referred to by this parameter. It is the caller’s responsibility to dispose of the pixel map.
  13363. destRect    Contains a pointer to a rectangle structure. The video digitizer component places the coordinates of the output rectangle into the structure referred to by this parameter. If there is no output rectangle defined, the component returns an empty rectangle.
  13364. m    Contains a pointer to a matrix structure. The video digitizer component places the transformation matrix into the structure referred to by this parameter. 
  13365. mask    Contains a pointer to a region handle. The video digitizer component places a handle to the mask region into the field referred to by this parameter. Applications can use masks to control the video into the destination rectangle. For more information about masks, see “About Video Digitizer Components,” which begins on page 8-3. If there is no mask region defined, the digitizer component sets this returned handle to nil. The caller is responsible for disposing of this region.
  13366. DESCRIPTION
  13367. Applications can set the video destination by calling either the VDSetPlayThruDestination function (described on page 8-35) or 
  13368. the VDSetPlayThruGlobalRect function (described in the next section). Applications should call the VDGetPlayThruDestination function only after having set the destination with the VDSetPlayThruDestination function.
  13369. RESULT CODEnoErr    0    No error    
  13370.  
  13371.  
  13372. VDSetPlayThruGlobalRect
  13373.  
  13374. You can use the VDSetPlayThruGlobalRect function in your application to establish the destination settings for a video digitizer component that is to digitize into a global rectangle. The application provides the desired settings as parameters to this function. Not all video digitizer components support global rectangles.
  13375. pascal VideoDigitizerError VDSetPlayThruGlobalRect
  13376.                                          (VideoDigitizerComponent ci,
  13377.                                             GrafPtr theWindow, 
  13378.                                             Rect *globalRect);
  13379. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13380. theWindow    Contains a pointer to the destination window.
  13381. globalRect
  13382. Contains a pointer to a rectangle that specifies the size and location of the video destination. This rectangle must be in the coordinate system of the destination window specified by the theWindow parameter. 
  13383. DESCRIPTION
  13384. Applications should verify that the digitizer component can accommodate the settings by calling the VDPreflightGlobalRect function, described in the next section.
  13385. RESULT CODESnoErr    0    No error    
  13386. digiUnimpErr    –2201    Function not supported    
  13387.  
  13388. SEE ALSO
  13389. Applications set the source digitizer rectangle by calling the VDSetDigitizerRect function, described on page 8-29.
  13390.  
  13391. VDPreflightGlobalRect
  13392.  
  13393. You can use the VDPreflightGlobalRect function in your application to verify that a video digitizer component can support a set of destination settings intended for use with the VDSetPlayThruGlobalRect function (described in the previous section).
  13394. pascal VideoDigitizerError VDPreflightGlobalRect 
  13395.                                                 (VideoDigitizerComponent ci, 
  13396.                                                     GrafPtr theWindow, 
  13397.                                                     Rect *globalRect);
  13398. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13399. theWindow    Contains a pointer to the destination window.
  13400. globalRect
  13401. Contains a pointer to a rectangle that specifies the size and location of the video destination. This rectangle must be in the coordinate system of the destination window specified by the theWindow parameter. If the video digitizer component cannot accommodate this rectangle, it changes the coordinates in the structure to specify a rectangle that it can support and sets the result to qtParamErr.
  13402. DESCRIPTION
  13403. The application provides the desired settings as parameters to this function. The video digitizer component then examines those settings. If the digitizer component can support the specified settings, it sets the result code to noErr. If the digitizer component cannot support the settings, it alters the input settings to reflect values that it can support and returns a result code of qtParamErr.
  13404. Applications should use this function to determine whether a video digitizer supports placing destination video into a rectangle that crosses screens. Digitizers that do not support this capability return a result of digiUnimpErr.
  13405. RESULT CODESnoErr    0    No error    
  13406. digiUnimpErr    –2201    Function not supported    
  13407. qtParamErr    –2202    Invalid parameter value    
  13408.  
  13409.  
  13410. VDGetMaxAuxBuffer
  13411.  
  13412. The VDGetMaxAuxBuffer function allows applications to obtain access to buffers that are located on special hardware. Digitizer components that are constrained to a single output device can provide an auxiliary buffer to support multiple buffering.
  13413. pascal VideoDigitizerError VDGetMaxAuxBuffer
  13414.                                          (VideoDigitizerComponent ci,
  13415.                                              PixMapHandle *pm, Rect *r);
  13416. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13417. pm    Contains a pointer to a pixel map handle. The video digitizer component returns a handle to the destination pixel map in the field referred to by this parameter. Do not dispose of this pixel map. If the digitizer component cannot allocate a buffer, this handle is set to nil.
  13418. r    Contains a pointer to a rectangle structure. The video digitizer component places the coordinates of the largest output rectangle it can support into the structure referred to by this parameter.
  13419. DESCRIPTION
  13420. You can use the VDGetMaxAuxBuffer function in your application to determine whether a video digitizer component supports an auxiliary buffer. If the digitizer component provides an auxiliary buffer, it is to your advantage to use it. By using the buffer, you may achieve better performance under some circumstances, such as when the digitizer component does not support DMA.
  13421. RESULT CODESnoErr    0    No error    
  13422. digiUnimpErr    –2201    Function not supported    
  13423.  
  13424.  
  13425. Controlling Compressed Source Devices
  13426.  
  13427. Some video digitizer components may provide functions that allow applications to work with digitizing devices that can provide compressed image data directly. Such devices allow applications to retrieve compressed image data without using the Image Compression Manager. However, in order to display images from the compressed data stream, there must be an appropriate decompressor component available to decompress the image data.
  13428. Video digitizers that can support compressed source devices set the digiOutDoesCompress flag to 1 in their capability flags (see “Capability Flags” beginning on page 8-14 for more information about these flags).
  13429. Applications can use the VDGetCompressionTypes function to determine the image-compression capabilities of a video digitizer. The VDSetCompression function allows applications to set some parameters that govern image compression.
  13430. Applications control digitization by calling the VDCompressOneFrameAsync function, which instructs the video digitizer to create one frame of compressed image data. The VDCompressDone function returns that frame. When an application is done with a frame, it calls the VDReleaseCompressBuffer function to free the buffer. An application can force the digitizer to place a key frame into the sequence by calling the VDResetCompressSequence function. Applications can turn compression on and off by calling VDSetCompressionOnOff.
  13431. Applications can obtain the digitizer’s image description structure by calling the VDGetImageDescription function. Applications can set the digitizer’s time base by calling the VDSetTimeBase function. 
  13432. All of the digitizing functions described in this section support only asynchronous digitization. That is, the video digitizer works independently to digitize each frame. Applications are free to perform other work while the digitizer works on each frame. 
  13433. The video digitizer component manages its own buffer pool for use with these functions. In this respect, these functions differ from the other video digitizer functions that support asynchronous digitization (see “Controlling Digitization” beginning on page 8-52 for more information about these functions).
  13434.  
  13435.  
  13436. VDGetCompressionTypes
  13437.  
  13438. The VDGetCompressionTypes function allows an application to determine the image-compression capabilities of the video digitizer.
  13439. pascal VideoDigitizerError VDGetCompressionTypes 
  13440.                                     (VideoDigitizerComponent ci,
  13441.                                     VDCompressionListHandle h);
  13442. ci    Identifies an application’s connection to the video digitizer component. An application obtains this value from the Component Manager’s OpenComponent function.
  13443. h    Identifies a handle to receive the compression information. The video digitizer returns information about its capabilities by formatting one or more compression list structures in this handle (the format and content of the compression list structure are discussed later). If the digitizer supports more than one compression type, it creates an array of structures in this handle.
  13444.     The video digitizer sizes this handle appropriately. It is the application’s responsibility to dispose of this handle when it is done with it.
  13445. DESCRIPTION
  13446. The video digitizer places its preferred, or default, compression options in the first compression list structure in the returned array. 
  13447. Note that there must be a decompressor component of the appropriate type available in the system if an application is to display images from a compressed image sequence.
  13448. The VDCompressionList data type defines the format and content of the compression list structure:
  13449. typedef struct VDCompressionList {
  13450.     CodecComponent                        codec;                    /* component ID */
  13451.     CodecType                        cType;                    /* compressor type */
  13452.     Str63                        typeName;                    /* compression algorithm */
  13453.     Str63                        name;                    /* compressor name string */
  13454.     long                        formatFlags;                    /* data format flags */
  13455.     long                        compressFlags;                    /* capabilities flags */
  13456.     long                        reserved;                    /* set to 0 */
  13457. } VDCompressionList, *VDCompressionListPtr, **VDCompressionListHandle;
  13458. Field descriptions
  13459. Field descriptions
  13460. codec    Contains the component identifier for the video digitizer’s compressor component. Some video digitizers may also implement their image-compression capabilities in an Image Compression Manager compressor component. In this case, the digitizer may allow the application to connect to and use the compressor. If so, the digitizer provides the compressor component’s identifier here. If not, the digitizer sets this field to nil.
  13461.  
  13462. cType    Identifies the compression algorithm supported by the video digitizer. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for a list of values supported by Apple.
  13463. typeName    Contains a text string that identifies the compression algorithm. An application may display this string to the user to identify the type of image compression being performed. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for a list of values supported by Apple.
  13464. name    Specifies the name of the compressor. The developer of the video digitizer assigns this name. An application may display this string to the user.
  13465. formatFlags    Contains flags that describe the data formats supported by the video digitizer. Typically, these flags are of interest only to developers of video digitizers and image compressors. See the chapter “Image Compressor Components” in this book for more information. 
  13466. compressFlags    Contains flags that describe the compression capabilities of the video digitizer. Typically, these flags are of interest only to developers of video digitizers and image compressors. See the chapter “Image Compressor Components” in this book for more information. 
  13467. reserved    Reserved for Apple. Always set to 0.
  13468. RESULT CODESnoErr    0    No error    
  13469. digiUnimpErr    –2201    Function not supported    
  13470.  
  13471.  
  13472.  
  13473. VDSetCompression
  13474.  
  13475. The VDSetCompression function allows applications to specify some compression parameters.
  13476. pascal VideoDigitizerError VDSetCompression 
  13477.                                     (VideoDigitizerComponent ci, 
  13478.                                      OSType compressType, short depth,
  13479.                                      Rect *bounds, CodecQ spatialQuality,
  13480.                                      CodecQ temporalQuality, 
  13481.                                       long keyFrameRate);
  13482. ci    Identifies the application’s connection to the video digitizer component. An application obtains this value from the Component Manager’s OpenComponent function.
  13483. compressType    
  13484. Specifies a compressor type. This value corresponds to the component subtype of the compressor component. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for more information about compressor types and for valid values for this parameter.
  13485. depth    Specifies the depth at which the image is likely to be viewed. Compressors may use this as an indication of the color or grayscale resolution of the image. Values of 1, 2, 4, 8, 16, 24, and 32 indicate the number of bits per pixel for color images. Values of 33, 34, 36, and 40 correspond to 1-bit, 2-bit, 4-bit, and 8-bit grayscale images.
  13486. bounds    Contains a pointer to a rectangle that defines the desired boundaries of the compressed image.
  13487. spatialQuality    
  13488. Indicates the desired image quality for each frame in the sequence. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for valid compression quality values.
  13489. temporalQuality    
  13490. Indicates the desired temporal quality for the sequence as a whole. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for valid compression quality values.
  13491. keyFrameRate    
  13492. Specifies the maximum number of frames to allow between key frames. This value defines the minimum rate at which key frames are to appear in the compressed sequence; however, the video digitizer may insert key frames more often than an application specifies. If the application requests no temporal compression (that is, the application set the temporalQuality parameter to 0), the video digitizer ignores this parameter.
  13493.     For more information about key frames, see the chapter “Image Compression Manager” in Inside Macintosh: QuickTime.
  13494. DESCRIPTION
  13495. An application may use the VDSetCompression function to control the parameters that govern image compression. An application may change the compressor type, image depth, and boundary rectangle parameters only when the digitizer is stopped. However, if an application sets these three parameters (that is, the compressType, depth, and bounds parameters) to 0, it may work with the other parameters while digitization is active. This allows an application to vary the data rate during digitization.
  13496. RESULT CODESnoErr    0    No error    
  13497. digiUnimpErr    –2201    Function not supported    
  13498. qtParamErr    –2202    Invalid parameter value    
  13499.  
  13500.  
  13501. VDSetCompressionOnOff
  13502.  
  13503. The VDSetCompressionOnOff function allows an application to start and stop compression by digitizers that can deliver either compressed or uncompressed image data.
  13504. pascal VideoDigitizerError VDSetCompressionOnOff 
  13505.                                     (VideoDigitizerComponent ci, 
  13506.                                       Boolean state);
  13507. ci    Identifies the application’s connection to the video digitizer component. An application obtains this value from the Component Manager’s OpenComponent function.
  13508. state    Contains a Boolean value that indicates whether to enable or 
  13509. disable compression. Applications set this parameter to true to enable compression. Setting it to false disables compression.
  13510. DESCRIPTION
  13511. This is a required function for digitizers that are going to perform compression. 
  13512. These digitizers have their digiOutDoesCompress capability flag set to 1 and their digiOutDoesCompressOnly flag set to 0. Digitizers that support this capability typically deliver uncompressed image data in addition to the compressed data stream; the uncompressed data is ready for display. 
  13513. Digitizers that only provide compressed data have their digiOutDoesCompressOnly flag set to 1, rather than 0. These digitizers may either ignore this function or return a nonzero result code.
  13514. Applications must call this function before they call either VDSetCompression or VDCompressOneFrameAsync. This allows the video digitizer to prepare for the operation.
  13515. RESULT CODESnoErr    0    No error    
  13516. digiUnimpErr    –2201    Function not supported    
  13517.  
  13518.  
  13519. VDCompressOneFrameAsync
  13520.  
  13521. The VDCompressOneFrameAsync function instructs the video digitizer to digitize and compress a single frame of image data. Because the component performs this action asynchronously, the application is free to do other things while the digitizer works on the image.
  13522. pascal VideoDigitizerError VDCompressOneFrameAsync 
  13523.                                     (VideoDigitizerComponent ci);
  13524. ci    Identifies the application’s connection to the video digitizer component. An application obtains this value from the Component Manager’s OpenComponent function.
  13525. DESCRIPTION
  13526. An application can determine when the digitizer is done with the frame by calling the VDCompressDone function, which is discussed next.
  13527. Unlike the VDGrabOneFrameAsync function (discussed on page 8-56), the video digitizer handles all details of managing data buffers.
  13528. RESULT CODESnoErr    0    No error    
  13529. digiUnimpErr    –2201    Function not supported    
  13530.  
  13531.  
  13532.  
  13533. VDCompressDone
  13534.  
  13535. The VDCompressDone function allows an application to determine whether the video digitizer has finished digitizing and compressing a frame of image data. An application starts the digitizing process by calling the VDCompressOneFrameAsync function, which was just discussed.
  13536. pascal VideoDigitizerError VDCompressDone 
  13537.                                     (VideoDigitizerComponent ci, 
  13538.                                      Boolean *done, Ptr *theData, 
  13539.                                      long *dataSize, 
  13540.                                      unsigned char *similarity, 
  13541.                                      TimeRecord *t);
  13542. ci    Identifies the application’s connection to the video digitizer component. An application obtains this value from the Component Manager’s OpenComponent function.
  13543. done    Contains a pointer to a Boolean value. Applications set this value to true when they are done, and set it to false if the operation is incomplete. 
  13544. theData    Contains a pointer to a field that is to receive a pointer to the compressed image data. The digitizer returns a pointer that is valid in the application’s current memory mode. 
  13545.     The digitizer allocates the memory into which it places the digitized data. An application must call the VDReleaseCompressBuffer function to dispose of this memory; this function is discussed next.
  13546. dataSize    Contains a pointer to a field to receive a value indicating the number of bytes of compressed image data.
  13547. similarity
  13548. Contains a pointer to a field to receive an indication of the relative similarity of this image to the previous image in a sequence. A value of 0 indicates that the current frame is a key frame in the sequence. A value 
  13549. of 255 indicates that the current frame is identical to the previous frame. Values from 1 through 254 indicate relative similarity, ranging from very different (1) to very similar (254). This field is only filled in if the temporal quality passed in with the VDSetCompression function (described on page 8-45) is not 0—that is, if it is not frame-differenced.
  13550. t    Contains a pointer to a time record. When the operation is complete, the digitizer fills in this structure with information indicating when the frame was grabbed. The time value stored in this structure is in the time base that the application sets with the VDSetTimeBase function (see page 8-51 for more information about this function). The format and content of this structure are discussed in the chapter “Movie Toolbox” in Inside Macintosh: QuickTime.
  13551. DESCRIPTION
  13552. An application can determine when the digitizer is done with the frame by calling the VDCompressDone function. When the digitizer is done, it sets the Boolean value referred to by the done parameter to true, and then returns information about the digitized and compressed frames via the theData, dataSize, similarity, and 
  13553. t parameters. 
  13554. If the digitizer is not yet done, it sets the Boolean value to false. In this case, the digitizer does not return any other information. 
  13555. Note that the digitizer is careful to return the frames in temporal order, and to avoid returning two frames with the same time value (unless the rate is set to 0). 
  13556. RESULT CODESnoErr    0    No error    
  13557. digiUnimpErr    –2201    Function not supported    
  13558.  
  13559. SEE ALSO
  13560. Applications must use the VDReleaseCompressBuffer function to free the memory that contains the compressed image data. This function is described in the next section.
  13561.  
  13562. VDReleaseCompressBuffer
  13563.  
  13564. The VDReleaseCompressBuffer function allows an application to free a buffer received from the VDCompressDone function.
  13565. pascal VideoDigitizerError VDReleaseCompressBuffer 
  13566.                                     (VideoDigitizerComponent ci, 
  13567.                                      Ptr bufferAddr);
  13568. ci    Identifies the application’s connection to the video digitizer component. An application obtains this value from the Component Manager’s OpenComponent function.
  13569. bufferAddr
  13570. Points to the location of the buffer to be released. This address must correspond to a buffer address that the application obtained from the VDCompressDone function (discussed in the previous section).
  13571. DESCRIPTION
  13572. Once an application frees the buffer, the video digitizer is able to use the buffer for other images. Applications should try to free these buffers as quickly as possible, so that 
  13573. the video digitizer can make optimum use of its buffer, and thereby support higher frame rates.
  13574. RESULT CODESnoErr    0    No error    
  13575. digiUnimpErr    –2201    Function not supported    
  13576.  
  13577.  
  13578. VDGetImageDescription
  13579.  
  13580. The VDGetImageDescription function allows an application to retrieve an image description structure from a video digitizer.
  13581. pascal VideoDigitizerError VDGetImageDescription 
  13582.                                     (VideoDigitizerComponent ci,      
  13583.                                      ImageDescriptionHandle desc);
  13584. ci    Identifies the application’s connection to the video digitizer component. An application obtains this value from the Component Manager’s OpenComponent function.
  13585. desc    Specifies a handle. The video digitizer fills this handle with an Image Compression Manager image description structure containing information about the digitizer’s current compression settings. The digitizer resizes the handle appropriately. It is the application’s responsibility to dispose of this handle.
  13586. RESULT CODESnoErr    0    No error    
  13587. digiUnimpErr    –2201    Function not supported    
  13588.  
  13589. SEE ALSO
  13590. See the chapter “Image Compression Manager” in Inside Macintosh: QuickTime for a complete description of the image description structure.
  13591.  
  13592.  
  13593. VDResetCompressSequence
  13594.  
  13595. The VDResetCompressSequence function allows an application to force the video digitizer to insert a key frame into a temporally compressed image sequence.
  13596. pascal VideoDigitizerError VDResetCompressSequence 
  13597.                                     (VideoDigitizerComponent ci);
  13598. ci    Identifies the application’s connection to the video digitizer component. An application obtains this value from the Component Manager’s OpenComponent function.
  13599. DESCRIPTION
  13600. After an application calls this function, the digitizer ensures that the next frame returned to the application is a key frame. 
  13601. RESULT CODESnoErr    0    No error    
  13602. digiUnimpErr    –2201    Function not supported    
  13603.  
  13604. SEE ALSO
  13605. An application can control the rate at which the digitizer inserts key frames by calling the VDSetCompression function, which is discussed beginning on page 8-45.
  13606.  
  13607. VDSetTimeBase
  13608.  
  13609. The VDSetTimeBase function allows an application to establish the video digitizer’s time coordinate system.
  13610. pascal VideoDigitizerError VDSetTimeBase 
  13611.                                                 (VideoDigitizerComponent ci, 
  13612.                                                  TimeBase t);
  13613. ci    Identifies the application’s connection to the video digitizer component. An application obtains this value from the Component Manager’s OpenComponent function.
  13614. t    Specifies the video digitizer’s new time base.
  13615. DESCRIPTION
  13616. Video digitizers return all time information in relation to the specified time base. For example, whenever a digitizer returns a compressed frame from its VDCompressDone function, it returns time information relating to the time when the frame was digitized and compressed. This time information is expressed in the time base that the application specifies with this function.
  13617. RESULT CODESnoErr    0    No error    
  13618. digiUnimpErr    –2201    Function not supported    
  13619.  
  13620.  
  13621. Controlling Digitization
  13622.  
  13623. This section describes the video digitizer component functions that allow applications to control video digitization. Video digitizer components allow applications to start and stop the digitizing process. Your application can request continuous digitization or single-frame digitization. When a digitizer component is operating continuously, it automatically places successive frames of digitized video into the specified destination. When a digitizer component works with a single frame at a time, the application and other software, such as an image compressor component, control the speed at which the digitized video is processed.
  13624. You can use the VDSetPlayThruOnOff function in your application to enable or disable digitization. When digitization is enabled, the video digitizer component places digitized video frame into the specified destination continuously. The application stops the digitizer by disabling digitization. This function can be used with both destination options.
  13625. Alternatively, your application can control digitization on a frame-by-frame basis. The VDGrabOneFrame and VDGrabOneFrameAsync functions digitize a single video frame; VDGrabOneFrame works synchronously, returning control to your application when it has obtained a complete frame, while VDGrabOneFrameAsync works asynchronously. The VDDone function helps you to determine when the VDGrabOneFrameAsync function is finished with a video frame. Your application can define the buffers for use with asynchronous digitization by calling the VDSetupBuffers function. Free the buffers by calling the VDReleaseAsyncBuffers function.
  13626. The VDSetFrameRate function allows applications to control the digitizer’s frame 
  13627. rate. The VDGetDataRate function returns the digitizer’s current data rate.
  13628.  
  13629.  
  13630. VDSetPlayThruOnOff
  13631.  
  13632. The VDSetPlayThruOnOff function allows applications to control continuous digitization. 
  13633. pascal VideoDigitizerError VDSetPlayThruOnOff
  13634.                                              (VideoDigitizerComponent ci,
  13635.                                              short state);
  13636. ci    Specifies the video digitizer component for the request. Applications obtain this reference from the Component Manager’s OpenComponent function.
  13637. state    A short integer that specifies whether to use continuous digitization. The following values are valid:
  13638. digitizerOff 
  13639. Turns off continuous digitization
  13640. digitizerOn
  13641. Turns on continuous digitization
  13642.     When an application stops continuous digitization, the video digitizer component must restore its alpha channel, blending mask, or key c